- 10
- 0
- 约2.49千字
- 约 4页
- 2020-09-07 发布于河北
- 举报
教师签名: 课程
教师签名:
课程
算法导论
学院
专业
(班级)
姓名
学号
日期
实验二 分治法归并排序
一、实验目的及要求
(一)实验目的
1、熟悉归并排序算法过程;
2、验证归并排序算法复杂度。
(二)实验要求
1、合理添加计数器
2、实现归并排序算法并验证复杂性
3、掌握递归方法
二、实验内容与步骤
1、设计归并排序算法
2、在算法中添加计数器,累计比较次数(注意计数器要用全局变量)和递归调用次数
3、完成算法分析
4、用JAVA实现算法,分别运行5-10个记录的排序,分析比较次数和规模之间的关系
5、判断运行结果是否与分析结果一致
6、和实验一的结果比较复杂性差别(用图表)
三、实验结果与分析
1、代码如下:( n=8 )
import java.util.Scanner;
public class GuiBingPaiXu {
static int com=0,use=0;//com表示比较次数,use表示递归调用次数
public static void main(String[] args) {
int [] a = new int [8];
Scanner scan = new Scanner (System.in);
int r=0, t=a.length-1;
int num;
System.out.println(请输入8个整数:);
//将输入的每个数记入数组
for(int i=0;ia.length;i++){
num = scan.nextInt();
a[i] = num;
}
//递归调用归并排序
PaiXu(a,r,t);
实验报告专用纸
成绩:
成绩:
课程学院专业
课程
学院
专业
(班级)
姓名
学号
日期
年 月 日
//输出各个数据
System.out.println(该8个整数从小到大是:);
for(int i=0;ia.length;i++){
System.out.print(a[i]+ );
}
System.out.println(\n比较次数:+com);
System.out.println(递归调用次数:+use);
}
//归并排序
public static void PaiXu(int b[], int r, int t){
use++;//每递归调用一次,加一
int s;
int [] temp = new int [b.length];
if (r==t) return;
else{
s=(r+t)/2;
PaiXu(b,r,s);
PaiXu(b,s+1,t);
GuiBing(b,temp,r,s,t);
for(int i=r;i=t;i++)
b[i]=temp[i];
}
}
//归并
public static void GuiBing(int b[],int temp[], int r, int s,int t){
int i=r,j=s+1,k=r;
while (i=s j=t){
if (b[i]=b[j])
temp[k++]=b[i++];
else
temp[k++]=b[j++];
com++;//每比较一次,加一
}
while(i=s)
temp[k++]=b[i++];
while(j=t)
temp[k++]=b[j++];
}
}
教师签名:
实验报告专用纸
成绩:
成绩:
课程学院专业
课程
学院
专业
(班级)
姓名
学号
日期
年 月 日
2、算法分析:
设待排序记录个数为n ,
该算法的基本语句是 归并算法的 循环体的 比较语句
“if (b[i]=b[j]) temp[k++]=b[i++];
else temp[k++]=b[j++]; ”,
其执行次数为: O(n) ,即执行一趟 归并算法 的时间复杂度为 O(n) 。
则 归并排序算法存在以下推式:T
所以,归并排序算法 的时间复杂度为 O(nlog
另外,归并排序算法递归调用次数为 2n-1 。
3、结果如下:
教师签名:
实验报告专用纸
原创力文档

文档评论(0)