排序性能分析Word文档格式.docx
《排序性能分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《排序性能分析Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
按排序过程中依据的不同原则,还可将内部排序分为插入排序(如直接插入排序、折半插入排序、表插入排序、希尔排序)、交换排序(冒泡排序、快速排序)、选择排序(如简单选择排序、树形选择排序、堆排序)、归并排序(如二路归并排序)、基数排序五种类型。
关键字:
时间复杂度;
排序;
性能分析
前言
排序是计算机程序设计中的一种重要操作。
它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。
内部排序的方法很多,主要分为插入排序(如直接插入排序、折半插入排序、表插入排序、希尔排序)、交换排序(如冒泡排序、快速排序)、选择排序(如简单选择排序、树形选择排序、堆排序)、归并排序(如二路归并排序)、基数排序五种类型。
一般情况下,排序时间省和占用空间少的要求很难两全。
因此,很难说那一种算法好。
在评价内排序算法的时间复杂性的优劣时,通常采用最坏情况下和平均情况下的代价加以衡量。
由于内排序的算法所耗费的时间与结点或记录的初始分布情况是相关的,因此仅仅考虑在最坏情况下的时间代价是不全面的。
通常假定结点或记录的各种分布情况都是等可能出现的,用平均情况下的时间代价衡量算法的好坏将更加客观。
每一种方法都有各自的优缺点,适合在不同的环境下使用。
这几种排序算法是在顺序存储结构上实现的,因此在排序过程中需要进行大量记录的移动。
当记录很大时,时间耗费很大,此时可采用静态链表作存储结构。
但是有的排序方法,无法实现表排序。
在这种情况下可以进行地址排序,即另设一个地址向量指示相应记录。
正文
1.问题描述
对各种排序算法进行定量的性能分析。
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
该设计要求学生演掌握各种排序的基本思想及排序算法。
2.逻辑设计
排序是计算机程序设计中的一种重要操作。
内部排序的方法很多,但是就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合在不同的环境下使用。
如果按排序过程中依据的不同原则对内部排序方法进行分类,则大致可分为插入排序,交换排序,选择排序,归并排序和记数排序等五类。
此实验通过对起泡排序、直插排序、选择排序、快速排序、归并排序这几种内部排序算法进行比较,能使我们更好的掌握这些排序的基本思想及排序算法。
通过该题目的设计过程,可以加深理解各种数据结构的逻辑结构、存储结构及相应上运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养我们的动手能力。
3.详细设计
Int整型char字符型
#defineN100//定义数组最大为100
constintt=3;
//定义希尔排序次数
intd[3]={4,3,1};
//定义希尔排序比较量
intqmt;
//快速排序的移动次数
intqct;
//快速排序的比较次数
主要函数:
voidmain()
voidoutput()
bubble_sort(n,A);
//冒泡排序
insertion_sort(n,A);
//插入排序
selection_sort(n,A);
//选择排序
quick_sort(n,A);
//快速排序
shell_sort(n,A);
//希尔排序
(1)插入排序伪码算法
VoidInsertSort(Recordnoder[],intn)
{
for(i=2;
i<
=n;
++i)
if(r[i]<
r[i-1])
r[0]=r[i];
for(j=i-1;
r[0]<
r[j];
--j)//如果待插表中最后一个小,则将其插入表中
r[j+1]=r[j];
//记录后移
r[j+1]=r[0];
//插入到正确位置
}
}
(2)希尔排序
voidShellSort(Recordnoder[],intn)
{
inti,j,d;
intbool;
intx;
d=n;
do{d=[d/2];
bool=1;
for(i=1;
=L.length-d;
i++)
{j=i+d;
if(r[i]>
r[j])
x=r[i];
r[i]=r[j];
r[j]=x;
bool=0;
}while(d>
1)
(3)选择排序
voidSelectSort(SeqListR)
inti,j,k;
for(i=1;
j<
i++)//做第i趟排序
{k=i;
for(j=i+1;
j++)//在当前无序区R[i…n]中选key最小的记录R[k]
if(R[j].key<
R[k].key)
k=j;
//k记下目前找到的最小关键字所在的位置
if(k!
=i)//交换R[i]和R[k]
{R[0]=R[i];
//R[0]作暂存单元
R[i]=R[k];
R[k]=R[0];
(4)冒泡排序
voidBubbleSort(SeqListR)
{//R[1…n]是待排序的文件,采用自下而上扫描,对R做冒泡排序
inti,j;
Booleanexchange;
//交换标志
n;
i++)//最多做n-1趟排序
exchange=FALSE;
//本趟排序开始前,交换标志应为假
for(j=n-1;
j>
=i;
j--)//对当前无序区R[i…n]自下而上扫描
if(R[j+1].key<
R[j].key)//交换记录
R[0]=R[j+1];
//R[0]不是哨兵仅作暂存单元
R[j+1]=R[j];
R[j]=R[0];
echange=TRUE;
//发生了交换,故将交换标志置为真
if(!
exchange)//本趟排序未发生交换,提前终止算法
return;
(5)快速排序
voidquicksort(SeqListR,intlow,inthigh)
intpivotpos;
//划分后的基准记录的位置
if(low<
high)
pivopos=partition(R,low,high);
quicksort(R,low,pivotpos-1);
//对左区间递归排序
quicksort(R,pivotpos+1,hidh);
//对右区间递归排序
intpartition(SeqListR,inti,intj)
ReceTypepivot=R[i];
//用区间的第一个记录作为基准
while(i<
j)//从区间两端交替向中间扫描,直至i=j为止
j&
&
R[j].key>
=pivot.key)
j--;
//从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]
if(i<
j)
R[i++]=R[j];
//相当于交换R[i]和R[j],交换后i指针加1
while(i<
R[i].key<
i++;
//从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]
R[j--]=R[i];
R[i]=pivot;
//基准记录已被最后定位
returni;
3.3函数调用关系图
图1关系图
4.程序编码
#include<
stdio.h>
voidoutput(intn,inta[],intct,intmt)//内部排序中调用的输出函数
inti;
printf("
\n排序结果:
"
);
for(i=0;
%d"
a[i]);
//输出各排序完成的数组
\n比较次数:
%d\n"
ct);
//输出各排序比较次数
移动次数:
%d\n\n"
mt);
//输出各排序移动次数
}
voidbubble_sort(intn,intA[])//冒泡排序
voidselection_sort(intn,intA[])//选择排序
voidquick(inta[],intlow,intup)//快速排序递归算法
voidinsertion_sort(intn,intA[])//插入排序
voidshell_sort(intn,intA[])//希尔排序
intn;
intA[N];
请输入数组大小(小于100):
scanf("
%d"
&
n);
//输入所需排序数组大小
for(i=0;
请输入数组a[%d]:
i);
A[i]);
//依次输入数组A[0]~A[n]
bubble_sort(n,A);
insertion_sort(n,A);
selection_sort(n,A);
quick_sort(n,A);
shell_sort(n,A);
5.程序调试与测试
1、插入排序算法测试结果
输入数据:
35170
2、希儿排序算法测试结果
421369
3、冒泡排序算法结果
651287
4、快速排序算法结果
23135024
5、选择排序算法结果
1523180
6、显示所有排序测试结果
7、显示所有排序测试结果
9132105311925
6.结果分析
6.1调试中遇到的问题及对问题的解决方法:
刚开始进行输入时,对有些排序不能实现,我就对不能实现的排序进行分析,对产生的语法错误进行了及时的改正,以至所有的排序算法能够顺利的实现。
6.2算法的时间复杂度和空间复杂度:
(1)插入排序的时间复杂度为O(n2)。
(2)希儿排序的时间复杂度为O(nlog2n)。
(3)冒泡排序的时间复杂度为O(n2)。
(4)快速排序的时间复杂度为O(nlog2n)。
(5)选择排序的时间复杂度为O(n2)。
设计总结
通过这次课程设计,我对排序算法的基本运算的实现有所掌握,也加深了对排序算法的理解,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。
数据结构设计的题目需用我们把理论变为上机调试。
在学习科目的第一节课起,在选题的时候老师就为我们阐述了它的重要性。
它对我们来说具有一定的难度。
而且他还是其它编程语言的一门基本学科。
刚开始做设计的时候确实有很多不理解的地方,,但对于我们来说也许不算是一个大的挑战,撞了几次壁之后,我们决定静下心来,仔细去写研究和编写程序。
不懂的就请教老师和同学,努力的去做,在自己和老师、同学的的帮助下来逐渐的完成这个设计,当我们可以开始运行自己的程序时,但却是有好多处的错误,虽然经过几经周折但还是看不出到底是哪里出现了错误,但是设计还是得继续下去,我们又多次请教了老师和同学,他们不厌其烦的给我们讲解,就这样我们逐渐的排除了错误,眼看着一个个错误就通过辛勤的努力就在眼前渐渐说的消失了,我们觉得非常的开心。
此次的程序设计能够成功,是我和搭档共同努力作用的结果。
在这一段努力学习的过程中,我们的编程设计有了明显的提高。
其实现在想起来,收获还真是不少,虽然说以前不是很懂这门语言,在它上面花费了好多心血,觉得它还是很难,但事实就是凡事都得花精力与时间去琢磨,去挖掘,然后你才能有所大的收获和感受,通过努力我明白了以前不懂的代码的应用,发现了每个程序都有一些共同点,通用的结构,相似的格式。
只要努力去学习,就会灵活的应用它。
参考文献
1.严蔚敏,吴伟民,《数据结构(C语言版)》,清华大学出版社。
2.严蔚敏,吴伟民,《数据结构题集(C语言版)》,清华大学出版社。
3.谭浩强,《C语言程序设计》,清华大学出版社。
致谢
通过两周的的努力,我们的课程设计终于完成了,这意味着这一阶段艰苦的热烈的付出即将告一段落。
在整个课程设计中,我在学习上和思想上都受益非浅,这除了自身的努力外,与指导的老师、同学和朋友的关心、支持和鼓励是分不开的。
在课程设计的编写过程中,我还要感谢在我学习期间给我极大关心和支持的各位老师以及关心我的同学和朋友。
感谢我的数据结构老师老师和C语言老师在以往的基础课学习中为我打下良好的基础,这是我这次课程设计能够顺利完成的前提。
我的同学在程序调试的初期给了我很大的帮助,没有他们的帮助我很难发现一些潜在的错误,在此对他们表示感谢。