实习四 内部排序算法的性能测试.docx
- 文档编号:4571418
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:17
- 大小:147.52KB
实习四 内部排序算法的性能测试.docx
《实习四 内部排序算法的性能测试.docx》由会员分享,可在线阅读,更多相关《实习四 内部排序算法的性能测试.docx(17页珍藏版)》请在冰豆网上搜索。
实习四内部排序算法的性能测试
1.需求分析:
【问题描述】:
教材中,每种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机数据比较各算法的关键字比较次数和关键字移动次数,取得实际计算结果。
【基本要求】:
(1)对以下6种常用的内部排序算法进行比较:
冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
(2)待排序表的表长不小于100,其中的数据要用伪随机数产生程序产生,至少用要用5组不同的输入数据作比较,比较的指标为关键字的比较次数和记录的移动次数。
(3)最后要对结果进行分析,包括对各数组得出结果波动大小的解释。
【开发环境】:
系统:
windows7
编程软件:
VC++6.0
2.设计:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:
快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
这两种排序都是不稳定的。
时间的估算:
排序方法
平均时间性能
最好时间性能
最坏时间性能
直接
O(n2)
O(n)
O(n2)
简单选择
O(n2)
O(n)
O(n2)
冒泡
O(n2)
O(n)
O(n2)
堆排序
O(nlog2n)
O(nlog2n)
O(nlog2n)
归并
O(nlog2n)
O(nlog2n)
O(nlog2n)
快速
O(nlog2n)
O(nlog2n)
O(nlog2n)
具体思想
结构体定义:
typedefintKeyType;
typedefstruct
{
KeyTypekey;
}DataType;
typedefstruct
{
intcompare;//比较次数
intmove;//移动次数
//定义及初始化成员变量
}Perf;
主函数:
voidmain()
{
inti,j,m,n,k;
n=size/2;
intD[7];//shellsort的增量.lb100取上整时为7
for(m=0;n>=1;m++)
{
D[m]=n;
n=n/2;
}
Perfper;
DataTypea[size-1];
DataTypeb[size-1];
DataTypec[size-1];
DataTyped[size-1];
DataTypee[size-1];
DataTypef[size-1];
srand((unsigned)time(NULL));//设置随机数种子
printf("你想测试数据的组数:
");
scanf("%d",&i);//表示有多少组测试数据
for(j=0;j
{
for(k=0;k { a[k].key=rand();//随机输入size个数值 b[k].key=a[k].key; c[k].key=a[k].key; d[k].key=a[k].key; e[k].key=a[k].key; f[k].key=a[k].key; } per=BubbleSort(a,size); printf("第%d组冒泡法排序时的移动次数和比较次数: \n",j+1); printf("%d%d\n",per.move,pare); per=InsertSort(b,size); printf("第%d组直接插入法排序时的移动次数和比较次数: \n",j+1); printf("%d%d\n",per.move,pare); per=SelectSort(c,size); printf("第%d组简单选择法排序时的移动次数和比较次数: \n",j+1); printf("%d%d\n",per.move,pare); per=visit(d,0,size-1); printf("第%d组快速排序法排序时的移动次数和比较次数: \n",j+1); printf("%d%d\n",per.move,pare); per=ShellSort(e,size,D,m); printf("第%d组希尔排序时的移动次数和比较次数: \n",j+1); printf("%d%d\n",per.move,pare); per=HeapSort(f,size); printf("第%d组堆排序时的移动次数和比较次数: \n",j+1); printf("%d%d\n",per.move,pare); printf("\n"); } printf("\n"); } 模块: 3.调试分析 首先是srand((unsigned)time(NULL))//设置随机数种子,然后通过rand()函数随机输入size(size为100)个数值,开始时不了解rand()函数没有包含其头文件"time.h"而导致出错,然后就是将rand()函数产生的随机值放到一个数组中,不同的排序都用该数组存储的rand()函数产生的随机值,发现调用时出现错误,而是rand()函数产生的随机值放到一个数组中,然后,在定义5个数组,分别存储第一个数组的中的数据,例如a[k].key=rand();b[k].key=a[k].key;c[k].key=a[k].key;d[k].key=a[k].key;e[k].key=a[k].key;f[k].key=a[k].key;不同的排序算法用不同的数组存储的数据,这样才不出错。 各个排序的算法书上都已经给出,但要认真理解每个排序算法,敲代码时容易出现敲错的一些小问题。 4.用户手册 运行程序后,上面会提示你想用几组不同的输入数据作比较(题目要求至少用5组),输入你想要比较的次数后,其会按照冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序的顺序显示出各自算法的移动次数和比较次数。 5.测试结果 6.源代码 ………………………………………….order.h…………………………………………………. typedefintKeyType; typedefstruct { KeyTypekey; }DataType; typedefstruct { intcompare;//比较次数 intmove;//移动次数 //定义及初始化成员变量 }Perf; //冒泡排序 PerfBubbleSort(DataTypea[],intn) {Perfbu; pare=0;//开始时比较次数置为0 bu.move=0;//开始时移动次数置为0 inti,j,flag=1;//flag用于标记本次交换排序过程是否有交换动作 DataTypetemp; for(i=1;i { flag=0; for(j=0;j { if(a[j].key>a[j+1].key) { flag=1; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; bu.move=bu.move+3;//移动次数 } pare++;//比较次数 } } returnbu; } //直接插入排序 PerfInsertSort(DataTypea[],intn) { inti,j; DataTypetemp; Perfin; pare=0; in.move=0; for(i=0;i { temp=a[i+1]; j=i; in.move=in.move+1; while(j>-1&&temp.key { a[j+1]=a[j]; j--; in.move++; pare++; } a[j+1]=temp; pare++; in.move++; } returnin; } //简单选择排序 PerfSelectSort(DataTypea[],intn) { inti,j,small; DataTypetemp; Perfse; pare=0; se.move=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实习四 内部排序算法的性能测试 实习 内部 排序 算法 性能 测试
![提示](https://static.bdocx.com/images/bang_tan.gif)