排序算法性能分析Word格式文档下载.docx
《排序算法性能分析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《排序算法性能分析Word格式文档下载.docx(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;
if(LT(L.r[i].key,L.r[i-dk].key)) {
L.r[0]=L.r[i];
//暂存
for(j=i-dk;
j>
0&
&
LT(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<
t;
++k)
shllInsert(L,data[k]);
(3)快速排序
intpart(sqlist&
L,intlow,inthigh){
//交换顺序表L中子表L。
R[low..high]的记录,使枢轴记录到位,并返回其所在位
// 此时在它之前(后)的记录均不大(小)于它。
pivotkey=L.[Low].key;
while(loe<
high){
While(low<
high&
l.r[high].key>
=pivotkey)--high;
L.r[lowL.r[high];
while(low<
l.r[low].key>
=pivotkey)++low;
L.r[lowL.r[high];
returnlow
}//partition
(4)选择排序
voidselectsort(splist&
L){
for(i=1;
L.length;
++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;
=n-1;
i++)
for(j=n;
=i+1;
j--)
if(r[j].key<
r[j-1].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<
stdio.h>
string.h>
#defineN100//定义数组最大为100
constintt=3;
//定义希尔排序次数
intd[3]={4,3,1};
//定义希尔排序比较量
intqmt;
//快速排序的移动次数
intqct;
//快速排序的比较次数
voidoutput(intn,inta[],intct,intmt)//内部排序中调用的输出函数
{
inti;
printf("
\n排序结果:
"
);
for(i=0;
n;
%d"
a[i]);
//输出各排序完成的数组
\n比较次数:
%d\n"
ct);
//输出各排序比较次数
移动次数:
%d\n\n"
mt);
//输出各排序移动次数
}
voidbubble_sort(intn,intA[])//冒泡排序
intmt=0;
//移动次数mt=movetime
intct=0;
//比较次数ct=cmdtime
inti,j,temp;
inta[N];
for(i=0;
a[i]=A[i];
//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)
n-1;
{
for(j=0;
j<
n-1-i;
j++,ct++)
if(a[j+1]<
a[j])//前后比较
temp=a[j],
a[j]=a[j+1],
a[j+1]=temp,
mt+=3;
//关键字交换计为3次移动
}
}
冒泡排序"
output(n,a,ct,mt);
voidselection_sort(intn,intA[])//选择排序
//移动次数movetime
//比较次数cmdtime
inti,j,temp,k;
k=i;
for(j=i+1;
if(a[k]>
a[j])
k=j;
temp=a[i],
a[i]=a[k],
a[k]=temp,
//关键字交换计为3次移动
选择排序"
voidquick(inta[],intlow,intup)//快速排序递归算法
if(low<
up)
i=low;
j=up;
temp=a[low],
qmt++;
while(i!
=j)
qct++;
while(i<
j&
a[j]>
temp)
j--,
if(i<
j)
a[i++]=a[j],
a[i]<
=temp)
i++,
a[j--]=a[i],
qct++,
a[i]=temp,
quick(a,low,j-1);
quick(a,i+1,up);
voidquick_sort(intn,intA[])//快速排序(通过调用快速排序递归算法完成)
quick(a,0,n-1);
//调用快速排序递归算法
快速排序"
output(n,a,qct,qmt);
voidinsertion_sort(intn,intA[])//插入排序
for(i=1;
mt++;
for(j=i-1;
=0&
temp<
a[j];
j--,ct++)
a[j+1]=a[j],
插入排序"
voidshell_sort(intn,intA[])//希尔排序
inti,j,k,h,y;
h=d[i];
for(j=h;
j++)
y=a[j],
for(k=j-h,ct++,mt++;
k>
y<
a[k];
k-=h)
a[k+h]=a[k];
a[k+h]=y;
希尔排序"
voidmain()
intn;
intA[N];
请输入数组大小(小于100):
scanf("
%d"
&
n);
//输入所需排序数组大小
请输入数组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);
//希尔排序
总结
在这三周的数据结构课程设计中,我的题目是:
排序算法性能分析,这三周课程设计中,通过该题目的设计过程,我加深了对排序算法的理解,对排序算法上基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。
一个人要完成所有的工作是非常困难和耗时的。
在以后的学习中我会更加注意各个方面的能力的协调发展。
在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。
三周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,来配合学习,三周中我收益很大,学到很多。
参考文献
1.严蔚敏,吴伟民,《数据结构(C语言版)》,清华大学出版社。
2.严蔚敏,吴伟民,《数据结构题集(C语言版)》,清华大学出版社。
3.《DATASTRUCTUREWITHC++》,WilliamFord,WilliamTcpp,清华大学出版社(影印版)。
4.谭浩强,《C语言程序设计》,清华大版社学出。
致谢
首先感谢我的指导老师卢鹏丽老师,他在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。
感谢我的数据结构老师老师和C语言老师在以往的基础课学习中为我打下良好的基础,这是我这次课程设计能够顺利完成的前提。
我的同学在设计完成后对程序的测试,没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。