数据结构课程设计侯亚兵.docx

上传人:b****5 文档编号:7829989 上传时间:2023-01-26 格式:DOCX 页数:13 大小:300.40KB
下载 相关 举报
数据结构课程设计侯亚兵.docx_第1页
第1页 / 共13页
数据结构课程设计侯亚兵.docx_第2页
第2页 / 共13页
数据结构课程设计侯亚兵.docx_第3页
第3页 / 共13页
数据结构课程设计侯亚兵.docx_第4页
第4页 / 共13页
数据结构课程设计侯亚兵.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构课程设计侯亚兵.docx

《数据结构课程设计侯亚兵.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计侯亚兵.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构课程设计侯亚兵.docx

数据结构课程设计侯亚兵

 

《数据结构》

课程设计报告书

 

题目:

快速排序算法性能分析

系别:

计算机科学与应用系

学号:

081006211

学生姓名:

侯亚兵

指导教师:

刘双红

完成日期:

2010.6.10

 

快速排序算法性能分析

1.需求分析

首先,要求能够自动随机生成50、100、500、1000、5000、10000个数据,这些数据用数组a[N]存储并输出到屏幕上,同时把这些数据写入文件中,以供与输出相比较看是否排序正确。

其次,程序对数组a[N]进行快速排序,并且要记录快速排序运算运行的时间。

最后,输出部分将经过快速排序后的数组a[N]和快速排序运算运行时间格式化输出并且写入文件。

2.概要设计

程序流程如图1所示:

图1

3.详细设计

采用VC++作为开发工具,用数组来存储随机产生的无序随机数,方便对其进行快速排序,排序后仍用数组存储并输出。

3.1产生随机数并存储到数组a[N]中

用rand函数产生一定个数的随机数,用srand设置rand()随机序列种子,以防总是产生相同的随机数。

把产生的随机数用数组a[N]存储起来并输出,以便于进行接下来的快速排序和排序前后的对照。

并且把成的数据写入到文件中方便查看和对照。

代码如下:

inti,N=1;

FILE*fp=fopen("123.txt","w+");

srand(time(NULL));

printf("请输入你要生成的随机数个数N的值(0=

");

scanf("%d",&N);

for(i=0;i

a[i]=rand();

printf("产生的%d个随机数为:

\n",N);

fprintf(fp,"产生的%d个随机数为:

\n",N);

for(i=0;i

{

printf("%10d",a[i]);

fprintf(fp,"%d",a[i]);

}

3.2快速排序算法的实现

快速排序(QuickSort)是对起泡排序的一种改进。

它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

假设待排序列为{a[0],a[1],……,a[N-1]},首先任意选取一个记录(通常可选第一个记录a[0])作为枢轴(pivot),然后按下述原则重新排列其余记录:

将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位置之后。

由此可以该“枢轴”记录最后所落的位置i作为分界线,将上述序列分割成两个子序列{a[0],a[1],……,a[i-1]}和{a[i+1],a[i+2],……,a[N-1]},这是一趟快速排序。

一趟快速排序的具体做法是:

附设两个记录low1和high1,它们的初始值分别为low1=a[0]和high1=a[N-1],设枢轴记录的关键字为pivotkey,则首先从high1所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,并且low1=low1+1,然后从low1所指位置起向后搜索,找到第一个关键字大于pivotkey的记录和枢轴记录互相交换,并且high1=high1-1,重复这两直至low1=high1为止。

然后当a[low1]=pivotkey,返回low1的值。

即把序列分割成了两个子序列。

然后在分别对分割所得的两个子序列进行递归形式快速排序算法。

最后即可得到一个有序的序列。

具体代码如下:

inta[10001];

intPartition(intlow1,inthigh1)

{

intp,q;

intpivokey=a[low1];

while(low1

{

while(low1=pivokey)

high1--;

if(low1

{

p=a[low1];

a[low1]=a[high1];

a[high1]=p;

low1=low1+1;

}

while(low1

low1++;

if(low1

{

q=a[high1];

a[high1]=a[low1];

a[low1]=a[high1];

high1=high1-1;

}

}

a[low1]=pivokey;

returnlow1;

}

voidQSort(intlow2,inthigh2)

{

intpivotloc;

if(low2

{

pivotloc=Partition(low2,high2);

QSort(low2,pivotloc-1);

QSort(pivotloc+1,high2);

}

}

3.3统计算法的执行时间

用时间函数clock进行时间的记录,在快速排序前记录一个时间值,在算法结束后在记录一个时间值,这两个时间值的差即为快速排序算法的执行时间。

具体代码如下:

clock_tbegin,end;

……

……//省略号代表快速排序过程代码

begin=clock();

end=clock();

printf("Thetimewas:

%lfseconds!

\n",(double)(end-begin)/CLOCKS_PER_SEC);

4.调试分析

在设计过程中主要遇到下列问题:

(1)每次生成的随机数都是相同的。

通过查阅c语言函数库得知可以用srand函数设置rand()随机序列种子,从而防止总是产生相同的随机数。

(2)记录算法执行时间的问题。

通过和同学探讨得知用时间函数clock()可以记录程序开始和结束时的时间值,两个时间值的差即为程序运行所用时间。

(3)输出数据格式混乱。

通过多次尝试得知以%10d的格式进行输出,输出的数据以右对齐的格式进行输出,位数不足的在数据左方以空格补齐。

5.测试结果

下面是我的测试函数及运行结果:

#include"stdafx.h"

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

inta[10001];

intPartition(intlow1,inthigh1)

{

intp,q;

intpivokey=a[low1];

while(low1

{

while(low1=pivokey)

high1--;

if(low1

{

p=a[low1];

a[low1]=a[high1];

a[high1]=p;

low1=low1+1;

}

while(low1

low1++;

if(low1

{

q=a[high1];

a[high1]=a[low1];

a[low1]=a[high1];

high1=high1-1;

}

}

a[low1]=pivokey;

returnlow1;

}

voidQSort(intlow2,inthigh2)

{

intpivotloc;

if(low2

{

pivotloc=Partition(low2,high2);

QSort(low2,pivotloc-1);

QSort(pivotloc+1,high2);

}

}

intmain(intargc,char*argv[])

{

inti,N=1;

FILE*fp=fopen("123.txt","w+");

clock_tbegin,end;

srand(time(NULL));

while(N!

=0)

{

printf("请输入你要生成的随机数个数N的值(0=

");

scanf("%d",&N);

if(N!

=0)

{

for(i=0;i

a[i]=rand();

printf("产生的%d个随机数为:

\n",N);

fprintf(fp,"产生的%d个随机数为:

\n",N);

for(i=0;i

{

printf("%10d",a[i]);

fprintf(fp,"%d",a[i]);

}

fprintf(fp,"\n");

fprintf(fp,"\n");

printf("\n");

printf("\n");

begin=clock();

QSort(0,N-1);

printf("排序后的%d个随机数为:

\n",N);

fprintf(fp,"排序后的%d个随机数为:

\n",N);

for(i=0;i

{

printf("%10d",a[i]);

fprintf(fp,"%d",a[i]);

}

fprintf(fp,"\n");

fprintf(fp,"\n");

printf("\n");

end=clock();

printf("Thetimewas:

%lfseconds!

\n",(double)(end-begin)/CLOCKS_PER_SEC);

fprintf(fp,"Thetimewas:

%lfseconds!

\n",(double)(end-begin)/CLOCKS_PER_SEC);

}

elseif(N==0)

exit(0);

}

fclose(fp);

return0;

}

测试结果如图2、图3、图4、图5、图6和图7所示:

图2

图3

图4

图5

 

图6

图7

其中图2表示:

对50个随机数快速排序所用时间为0.008秒

其中图3表示:

对100个随机数快速排序所用时间为0.019秒

其中图4表示:

对500个随机数快速排序所用时间为0.117秒

其中图5表示:

对1000个随机数快速排序所用时间为0.134秒

其中图6表示:

对5000个随机数快速排序所用时间为0.658秒

其中图7表示:

对10000个随机数快速排序所用时间为1.309秒

6.时间统计图如图8所示:

图8

图8表示:

对50个随机数快速排序所用时间为0.008秒

对100个随机数快速排序所用时间为0.019秒

对500个随机数快速排序所用时间为0.117秒

对1000个随机数快速排序所用时间为0.134秒

对5000个随机数快速排序所用时间为0.658秒

对10000个随机数快速排序所用时间为1.309秒

运行环境:

hp笔记本

处理器:

Intel(R)Core(TM)2DuoCPUT6500

@2.10GHz2.10GHz

内存(RAM):

2.0GB

操作系统:

win7

7.总结

经过《数据结构》课程设计,并且通过对该程序的编译、调试和运行,使我更好的掌握了快速排序的算法以及快速排序的性能,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉了程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。

这次《数据结构》课程设计也考验了我对数据结构的掌握以及编写程序的能力,使我更加清楚的认识到了自己的能力和不足,使我在今后的学习生活当中知道了该去学习和掌握哪些知识,消除了学习的盲目性,同时也找到了学习的目标。

总的来说,通过这次《数据结构》课程设计,提高了我思考问题、分析问题、解决问题的能力以及自己主动学习和研究问题的能力。

这对我以后的学习和工作都是有很大的帮助的。

 

指导教师评语:

 

程序成绩:

报告成绩:

综合成绩:

指导教师姓名:

批改日期:

年月日

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

当前位置:首页 > 农林牧渔 > 林学

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

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