排序算法性能分析.docx
- 文档编号:8220247
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:15
- 大小:84.39KB
排序算法性能分析.docx
《排序算法性能分析.docx》由会员分享,可在线阅读,更多相关《排序算法性能分析.docx(15页珍藏版)》请在冰豆网上搜索。
排序算法性能分析
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2011年春季学期
数据结构课程设计
题目:
专业班级:
姓名:
学号:
指导教师:
成绩:
_____________________
目录
摘要3
前言4
正文5
1.采用类c语言定义相关的数据类型5
2.各模块的伪码算法5
3.函数的调用关系图6
4.调试分析7
a、调试中遇到的问题及对问题的解决方法7
b、算法的时间复杂度和空间复杂度7
5.源程序8
总结13
参考文献14
致谢15
摘要
排序是计算机程序设计中的一种重要操作。
各种部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
关键字:
排序,性能分析。
前言
排序是计算机程序设计中的一种重要操作。
它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。
内部排序的方法很多,但是就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合在不同的环境下使用。
如果按排序过程中依据的不同原则对内部排序方法进行分类,则大致可分为插入排序,交换排序,选择排序,归并排序和记数排序等五类。
这几种排序算法是在顺序存储结构上实现的,因此在排序过程中需要进行大量记录的移动。
当记录很大时,时间耗费很大,此时可采用静态链表作存储结构。
但是有的排序方法,无法实现表排序。
在这种情况下可以进行地址排序,即另设一个地址向量指示相应记录。
正文
1.采用类c语言定义相关的数据类型
int整型,char字符型,
2.各模块的伪码算法
(1)插入排序伪码算法:
voidInsertSort(Splist&L){
for(i=2;i<=L.length;++i)
if(LT(L.r[i].key,L.r[i-1].key)) //“《”,须将L.r[i]插入有序子表
{L.r[0]=L.r[i]; //复制为哨兵
L.r[i]=L.r[i-1];
For(j)i-2;LT(L.r[0].key,L.r[j].key);--j)
L.r[j+1]=L.r[j]; //记录后移
L.r[j+1]=L.r[0];//插入到正确位置
}
}//InsertSort
(2)希尔排序
voidshllInsert(Splist&L,intdk){
for(i=dk+1;i<=L.length;++i)
if(LT(L.r[i].key,L.r[i-dk].key)) {
L.r[0]=L.r[i]; //暂存
for(j=i-dk;j>0&<(L.r0].key,L.r[j].key);j-=dk)
L.r[j+dk]=L.r[j]; //记录后移
L.r[j+dk]=L.r[0];}//插入
}//shellsort
voidshllsort(Splist&L,intdata[],intt){
for(k=0;k shllInsert(L,data[k]); }//shellsort (3)快速排序 intpart(sqlist&L,intlow,inthigh){ //交换顺序表L中子表L。 R[low..high]的记录,使枢轴记录到位,并返回其所在位 // 此时在它之前(后)的记录均不大(小)于它。 pivotkey=L.[Low].key; while(loe While(low L.r[lowL.r[high]; while(low L.r[lowL.r[high]; } returnlow }//partition (4)选择排序 voidselectsort(splist&L){ for(i=1;i j=selectMinKey(L,i); if(i! =j)L.r[i]L.r[j]; } }//selectsort (5)其泡排序 voidbubblesort(sqlistr,intn){ intI,j,w; for(i=1;i<=n-1;i++) for(j=n;j>=i+1;j--) if(r[j].key { W=r[j]; R[j]=r[j-1]; R[j-1]=w;} 3.函数的调用关系图 Main Insertionsortquicksortbubblesortselectionsortshellsort Outputquick 4.调试分析 a、调试中遇到的问题及对问题的解决方法 刚开始进行输入时,对有些排序不能实现,我就对不能实现的排序进行分析,对产生的语法错误进行了及时的改正,以至所有的排序算法能够顺利的实现。 b、算法的时间复杂度和空间复杂度 算法的时间复杂度分别是O(n2), O(nlog2n),O(log2n), 测试结果: 234561381 321245394637100200 5.源程序 #include #include #defineN100//定义数组最大为100 constintt=3;//定义希尔排序次数 intd[3]={4,3,1};//定义希尔排序比较量 intqmt;//快速排序的移动次数 intqct;//快速排序的比较次数 voidoutput(intn,inta[],intct,intmt)//内部排序中调用的输出函数 { inti; printf("\n排序结果: "); for(i=0;i printf("%d",a[i]);//输出各排序完成的数组 printf("\n比较次数: %d\n",ct);//输出各排序比较次数 printf("移动次数: %d\n\n",mt);//输出各排序移动次数 } voidbubble_sort(intn,intA[])//冒泡排序 { intmt=0;//移动次数mt=movetime intct=0;//比较次数ct=cmdtime inti,j,temp; inta[N]; for(i=0;i a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用) for(i=0;i { for(j=0;j { if(a[j+1] temp=a[j], a[j]=a[j+1], a[j+1]=temp, mt+=3;//关键字交换计为3次移动 } } printf("冒泡排序"); output(n,a,ct,mt); } voidselection_sort(intn,intA[])//选择排序 { intmt=0;//移动次数movetime intct=0;//比较次数cmdtime inti,j,temp,k; inta[N]; for(i=0;i a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用) for(i=0;i { k=i; for(j=i+1;j if(a[k]>a[j]) k=j; temp=a[i], a[i]=a[k], a[k]=temp, mt+=3;//关键字交换计为3次移动 } printf("选择排序"); output(n,a,ct,mt); } voidquick(inta[],intlow,intup)//快速排序递归算法 { inti,j,temp; if(low { i=low; j=up; temp=a[low], qmt++; while(i! =j) { qct++; while(i j--, qct++; if(i a[i++]=a[j], qct++; qmt++; while(i i++, qct++; if(i a[j--]=a[i], qct++, qmt++; } a[i]=temp, qmt++; quick(a,low,j-1); quick(a,i+1,up); } } voidquick_sort(intn,intA[])//快速排序(通过调用快速排序递归算法完成) { inti; inta[N]; for(i=0;i a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用) quick(a,0,n-1);//调用快速排序递归算法 printf("快速排序"); output(n,a,qct,qmt); } voidinsertion_sort(intn,intA[])//插入排序 { intmt=0;//移动次数movetime intct=0;//比较次数cmdtime inti,j,temp; inta[N]; for(i=0;i a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用) for(i=1;i { temp=a[i], mt++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 算法 性能 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)