数据结构课程设计侯亚兵.docx
《数据结构课程设计侯亚兵.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计侯亚兵.docx(13页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计侯亚兵.docx](https://file1.bdocx.com/fileroot1/2023-1/26/4d04a081-0d53-479b-9790-dcdbde8f38cd/4d04a081-0d53-479b-9790-dcdbde8f38cd1.gif)
数据结构课程设计侯亚兵
《数据结构》
课程设计报告书
题目:
快速排序算法性能分析
系别:
计算机科学与应用系
学号:
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;ia[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(low1low1++;
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(low1low1++;
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;ia[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.总结
经过《数据结构》课程设计,并且通过对该程序的编译、调试和运行,使我更好的掌握了快速排序的算法以及快速排序的性能,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉了程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。
这次《数据结构》课程设计也考验了我对数据结构的掌握以及编写程序的能力,使我更加清楚的认识到了自己的能力和不足,使我在今后的学习生活当中知道了该去学习和掌握哪些知识,消除了学习的盲目性,同时也找到了学习的目标。
总的来说,通过这次《数据结构》课程设计,提高了我思考问题、分析问题、解决问题的能力以及自己主动学习和研究问题的能力。
这对我以后的学习和工作都是有很大的帮助的。
指导教师评语:
程序成绩:
报告成绩:
综合成绩:
指导教师姓名:
批改日期:
年月日