数据结构课程设计各种排序算法比较附带源代码Word下载.docx

上传人:b****5 文档编号:18776132 上传时间:2023-01-01 格式:DOCX 页数:21 大小:132.45KB
下载 相关 举报
数据结构课程设计各种排序算法比较附带源代码Word下载.docx_第1页
第1页 / 共21页
数据结构课程设计各种排序算法比较附带源代码Word下载.docx_第2页
第2页 / 共21页
数据结构课程设计各种排序算法比较附带源代码Word下载.docx_第3页
第3页 / 共21页
数据结构课程设计各种排序算法比较附带源代码Word下载.docx_第4页
第4页 / 共21页
数据结构课程设计各种排序算法比较附带源代码Word下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数据结构课程设计各种排序算法比较附带源代码Word下载.docx

《数据结构课程设计各种排序算法比较附带源代码Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计各种排序算法比较附带源代码Word下载.docx(21页珍藏版)》请在冰豆网上搜索。

数据结构课程设计各种排序算法比较附带源代码Word下载.docx

且子程序只有在被调用时才会运行大大节约系统资源减少了运算时间。

同时由于功能的隔离使得程序的扩展性大大提高,无论程序将要任何改动时,都会方便很多。

源代码

#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种排序方法处理一组相同数据时,快速排序处理速度最快堆排序次之,归并排序最慢。

六.课设心得

整个程序前前后后整整用了一个星期,每天只要有空闲时间就在翻书本,画流程图,写代码,反反复复一点一点。

一个星期的编写让我进步不少,心得也不少,但是说实话让我认识最深的是四点,刻骨铭心:

对于编程来说看书很重要,但实实在在的动手去编才是王道!

任何程序想要写起来不被自己搞晕,就一定要画流程图,省时省事!

编程一定养成良好的编程习惯,无论命名还是结构!

任何程序算法是灵魂,程序的好坏很大部分取决于算法,只是一组数的排序差别就如此之大,跟别说一个比排序负责多倍的排序!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1