综合排序算法比较.docx
- 文档编号:7035252
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:12
- 大小:273.21KB
综合排序算法比较.docx
《综合排序算法比较.docx》由会员分享,可在线阅读,更多相关《综合排序算法比较.docx(12页珍藏版)》请在冰豆网上搜索。
综合排序算法比较
数据结构
课程设计
班级:
学号:
姓名:
日期:
一、课程设计概述:
本次数据结构课程设计共完成一个题:
综合排序比较
使用语言:
C
编译环境:
TC3.0
二、课程设计题目
实验内容:
综合排序算法的比较
问题描述:
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概的执行时间。
试通过随机的数据比较各算法的关键字比较次数和关键字移动的次数。
需求分析:
(1)对以下各种常用的内部排序算法进行比较:
直接插入排序,折半插入排序,二路归并排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序,基数排序。
(2)待排序的表长不少于100,要求采用随机数。
(3)至少要用5组不同的输入数据做比较:
比较的次数为有关键字参加的比较次数和关键字移动的次数
(4)改变数据量的大小,观察统计数据的变化情况。
(5)对试验统计数据进行分析。
对各类排序算法进行综合评价。
概要设计:
voidInsertSort(SeqListR)//直接插入排序法
voidBubbleSort(SeqListR)//冒泡排序
//快速排序
//一次划分函数
voidQuickSort(SeqListR,intlow,inthigh)//快速排序
voidSelectSort(SeqListR)//直接选择排序
//堆排序
//大根堆调整函数
voidHeapify(SeqListR,intlow,inthigh)
voidBuildHeap(SeqListR)//构造大根堆
voidHeapSort(SeqListR)//堆排序
voidMerge(SeqListR,intlow,intm,inthigh)//二路归并排序
voidMergePass(SeqListR,intlength)//对R[1..n]做一趟归并排序
voidMergeSort(SeqListR)//=自底向上对R[1..n]做二路归并排序
voidinput_int(SeqListR)//输入顺序表
voidoutput_int(SeqListR)//输出顺序表
流程图:
输入1
输入2输入3输入4输入5输入6输入7
详细设计:
#include
#include
#defineMax1024
typedefstruct
{
intkey;
}RecType;
typedefRecTypeSeqList[Max+1];
intn;
voidInsertSort(SeqListR)//直接插入排序法
{
inti,j;
for(i=2;i<=n;i++)
if(R[i].key { R[j+1]=R[0]; } } voidBubbleSort(SeqListR)//冒泡排序 { inti,j; boolexchange; exchange=false; for(j=n-1;j>=i;j--) { if(R[j+1].key { R[0]=R[j+1]; R[j+1]=R[j]; R[j]=R[0]; exchange=true; } if(! exchange)return; } } //快速排序 //一次划分函数 intPartition(SeqListR,inti,intj) { RecTypepivot=R[i]; while(i { while(i j--; if(i while(i i++; if(i R[j--]=R[i]; } R[i]=pivot; returni; } voidQuickSort(SeqListR,intlow,inthigh)//快速排序 { intpivotpos; if(low { pivotpos=Partition(R,low,high); QuickSort(R,low,pivotpos-1); QuickSort(R,pivotpos+1,high); } } voidSelectSort(SeqListR)//直接选择排序 { inti,j,k; for(i=1;i { k=i; for(j=i+1;j<=n;j++) if(R[j].key k=j; if(k! =i) { R[0]=R[i];R[i]=R[k];R[k]=R[0]; } } } //堆排序 //大根堆调整函数 voidHeapify(SeqListR,intlow,inthigh) { intlarge; RecTypetemp=R[low]; for(large=2*low;large<=high;large*=2) { if(large large++; if(temp.key>=R[large].key) break; R[low]=R[large]; low=large; } R[low]=temp; } voidBuildHeap(SeqListR)//构造大根堆 { inti; for(i=n/2;i>0;i--) Heapify(R,i,n); } voidHeapSort(SeqListR)//堆排序 { inti; BuildHeap(R); for(i=n;i>1;i--) { R[0]=R[1];R[1]=R[i];R[i]=R[0]; Heapify(R,1,i-1); } } voidMerge(SeqListR,intlow,intm,inthigh)//二路归并排序 { inti=low,j=m+1,p=0; RecType*R1; R1=(RecType*)malloc((high-low+1)*sizeof(RecType)); while(i<=m&&j<=high) R1[p++]=(R[i].key<=R[j].key)? R[i++]: R[j++]; while(i<=m) R1[p++]=R[i++]; while(j<=high) R1[p++]=R[j++]; for(p=0,i=low;i<=high;p++,i++) R[i]=R1[p]; } voidMergePass(SeqListR,intlength)//对R[1..n]做一趟归并排序 { inti; for(i=1;i+2*length-1<=n;i=i+2*length) Merge(R,i,i+length-1,i+2*length-1); if(i+length-1 Merge(R,i,i+length-1,n); } voidMergeSort(SeqListR)//=自底向上对R[1..n]做二路归并排序 { intlength; for(length=1;length MergePass(R,length); } voidinput_int(SeqListR)//输入顺序表 { inti; printf("请输入顺序表的个数: "); scanf("%d",&n); printf("请输入值",n); for(i=1;i<=n;i++) scanf("%d",&R[i].key); } voidoutput_int(SeqListR)//输出顺序表 { inti; for(i=1;i<=n;i++) printf("%4d",R[i].key); } voidmain() { inti; SeqListR; input_int(R); printf("\t********Select**********\n"); printf("\t1: 直插法\n"); printf("\t2: 冒泡法\n"); printf("\t3: 快速排序\n"); printf("\t4: 直接选择排序\n"); printf("\t5: 堆排序\n"); printf("\t6: 归并排序\n"); printf("\t7: 结束程序\n"); printf("\t***************************\n"); scanf("%d",&i); switch(i) { case1: InsertSort(R);break; case2: BubbleSort(R);break; case3: QuickSort(R,1,n);break; case4: SelectSort(R);break; case5: HeapSort(R);break; case6: MergeSort(R);break; case7: exit(0); } printf("Sortreult: "); output_int(R); } 运行结果及分析: 三、参考文献: [1].《C程序设计》第二版,谭浩强著。 北京: 清华大学出版社,2004年。 [2].《数据结构》严蔚敏、吴伟民。 北京: 清华大学出版社,2005年。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 排序 算法 比较
![提示](https://static.bdocx.com/images/bang_tan.gif)