数据结构课程设计各种排序算法比较附带源代码Word下载.docx
《数据结构课程设计各种排序算法比较附带源代码Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计各种排序算法比较附带源代码Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
且子程序只有在被调用时才会运行大大节约系统资源减少了运算时间。
同时由于功能的隔离使得程序的扩展性大大提高,无论程序将要任何改动时,都会方便很多。
源代码
#include<
stdio.h>
time.h>
stdlib.h>
inta[30000];
intchoice;
intchoice1;
structxlx{
intkey;
intlink;
}aa[30000];
intaaa[300000];
voidmain1();
/*************************直接插入排序函数***********************/
voiddirect(inta[]){
printf("
\n现在使用直接插入排序法进行排序:
\n"
);
inti,j,w;
for(i=0;
i<
30000;
i++)
{
for(j=i;
j>
=0;
j--)
if(a[j]>
=a[j+1])
w=a[j];
a[j]=a[j+1];
a[j+1]=w;
}
}
/*************************冒泡排序函数*************************/
voidbubble_sort(inta[])
{
printf("
\n下面使用冒泡排序法进行排序:
"
inti,j,w;
for(j=0;
j<
30000-i;
j++)
if(a[j]>
a[j+1])
{
/*************************选择排序****************************/
voidchoices_sort(inta[])
{printf("
\n现在使用选择排序法进行排序:
inti,j,k,t;
k=i;
for(j=i+1;
if(a[k]>
a[j])
k=j;
t=a[i];
a[i]=a[k];
a[k]=t;
/*************************快速排序****************************/
quick(intfirst,intend,intL[])
intleft=first,right=end,key;
key=L[first];
while(left<
right)
{while((left<
right)&
&
(L[right]>
=key))
right--;
if(left<
L[left++]=L[right];
while((left<
(L[left]<
left++;
right)L[right--]=L[left];
L[left]=key;
returnleft;
voidquick_sort(intL[],intfirst,intend)
intsplit;
if(first<
end)
{split=quick(first,end,L);
quick_sort(L,first,split-1);
quick_sort(L,split+1,end);
/**************************堆排序*****************************/
voidsift(int*x,intn,ints)
intt,k,j;
t=*(x+s);
/*暂存开始元素*/
k=s;
/*开始元素下标*/
j=2*k+1;
/*右子树元素下标*/
while(j<
n)
if(j<
n-1&
*(x+j)<
*(x+j+1))/*判断是否满足堆的条件:
满足就继续下一轮比较,否则调整。
*/
j++;
if(t<
*(x+j))/*调整*/
*(x+k)=*(x+j);
k=j;
/*调整后,开始元素也随之调整*/
else/*没有需要调整了,已经是个堆了,退出循环。
break;
*(x+k)=t;
/*开始元素放到它正确位置*/
voidheap_sort(int*x,intn)
inti,k,t;
for(i=n/2-1;
i>
i--)
sift(x,n,i);
/*初始建堆*/
}
for(k=n-1;
k>
=1;
k--)
t=*(x+0);
/*堆顶放到最后*/
*(x+0)=*(x+k);
sift(x,k,0);
/*剩下的数再建堆*/
/*************************归并排序****************************/
intlistmerge(structxlxlist[],intfirst,intsecond)/*递归传递*/
intstart=30000;
while(first!
=-1&
second!
=-1)
if(list[first].key<
=list[second].key)
list[start].link=first;
first=list[second].link;
else
list[start].link=second;
start=second;
second=list[second].link;
if(first=-1)
list[start].link=second;
returnlist[30000].link;
intrmerge(structxlxlist[],intlower,intupper)/*归并并返回已排序的结果数组的起始位置*/
intmiddle;
if(lower>
=upper)
returnlower;
else{
middle=(lower+upper);
returnlistmerge(list,rmerge(list,lower,middle),
rmerge(list,middle+1,upper));
/*************************时间计算函数************************/
voidtimer(intchoice)
doublet1,t2,t;
inti;
t1=(double)clock();
if(choice==1)
direct(a);
if(choice==2)
bubble_sort(a);
if(choice==3)
choices_sort(a);
if(choice==4)
{
\n现在使用快速排序法进行排序:
quick_sort(a,0,29999);
if(choice==5)
heap_sort(a,30000);
if(choice==6)
rmerge(aa,0,29999);
t2=(double)clock();
t=difftime(t2,t1)/1000;
for(i=0;
%d"
a[i]);
\n排序结束您所用排序时间为:
%f秒\n"
t);
/**************************菜单函数***************************/
voidmenu(intchoice1)
inti;
if(choice1==1)
=30000;
{a[i]=aaa[i];
aa[i].key=aaa[i];
main1();
if(choice1==2)
谢谢使用,再见!
!
/**************************生成随机数函数**********************/
voidsjs()
inti=0,j,b,h,l;
请输入你所期望的将要生成随机数的取值范围:
最小值(不能为负数):
scanf("
%d"
&
l);
最大值(无上限):
h);
srand((int)time(0));
b=rand();
if(b>
=l&
b<
=h)
{
a[i]=b;
aa[i].key=b;
aaa[i]=b;
i++;
}
printf("
voidmain1(){
\n\n请选择你所希望使用的排序方法:
\n\n1。
直接插入排序\n2。
冒泡排序\n3。
选择排序\n4。
快速排序\n5。
堆排序\n6。
归并排序\n"
scanf("
choice);
timer(choice);
\n\n排序完毕,请选择下一步您要完成的工作:
\n\n1.返回选择另一种排序方法排序\n2.退出\n"
choice1);
menu(choice1);
/*************************主函数******************************/
voidmain()
sjs();
main1();
}for(k=n-1;
}
voidtime(intchoice){doublet1,t2,t;
time(choice);
运行结果分析
生成30000个随机数
选择使用排序算法
直接排序排序所用时间
冒泡排序所用时间
选择排序所用时间
快速排序所用时间
堆排序所用时间
各排序排序时间分别为:
直接排序:
3.448秒
冒泡排序:
3.76秒
选择排序:
1.575秒
快速排序:
0.00秒
堆排序:
0.016秒
归并排序:
7.487秒
(注:
此处快速排序并非排序时间为0,而是时间很短在表示范围外,当实验数据扩大到一定数值后会有相应时间显示)
通过数据不难看出6种排序方法处理一组相同数据时,快速排序处理速度最快堆排序次之,归并排序最慢。
六.课设心得
整个程序前前后后整整用了一个星期,每天只要有空闲时间就在翻书本,画流程图,写代码,反反复复一点一点。
一个星期的编写让我进步不少,心得也不少,但是说实话让我认识最深的是四点,刻骨铭心:
对于编程来说看书很重要,但实实在在的动手去编才是王道!
任何程序想要写起来不被自己搞晕,就一定要画流程图,省时省事!
编程一定养成良好的编程习惯,无论命名还是结构!
任何程序算法是灵魂,程序的好坏很大部分取决于算法,只是一组数的排序差别就如此之大,跟别说一个比排序负责多倍的排序!