- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构课程设计-侯亚兵.doc
《数据结构》
课 程 设 计 报 告 书
题 目: 快速排序算法性能分析
系 别: 计算机科学与应用系
学 号: 081006211
学生姓名: 侯亚兵
指导教师: 刘双红
完成日期: 2010.6.10
快速排序算法性能分析
需求分析
首先,要求能够自动随机生成50、100、500、1000、5000、10000个数据,这些数据用数组a[N]存储并输出到屏幕上,同时把这些数据写入文件中,以供与输出相比较看是否排序正确。
其次,程序对数组a[N]进行快速排序,并且要记录快速排序运算运行的时间。
最后,输出部分将经过快速排序后的数组a[N]和快速排序运算运行时间格式化输出并且写入文件。
概要设计
程序流程如图1所示:
结束
开始
读入N的值
N=0
产生N个随机数,用数组a[N]存储并输出,然后写入文件
对数组a[N]快速排序,并记录快速排序所用时间,然后输出a[N]和所用时间并写入文件
图1
详细设计
采用VC++作为开发工具,用数组来存储随机产生的无序随机数,方便对其进行快速排序,排序后仍用数组存储并输出。
3.1 产生随机数并存储到数组a[N]中
用rand函数产生一定个数的随机数,用srand设置rand()随机序列种子,以防总是产生相同的随机数。把产生的随机数用数组a[N]存储起来并输出,以便于进行接下来的快速排序和排序前后的对照。并且把成的数据写入到文件中方便查看和对照。
代码如下:
int i,N=1;
FILE *fp=fopen(123.txt,w+);
srand( time(NULL) );
printf(请输入你要生成的随机数个数N的值(0=N=10000),输入0表示退出程序:);
scanf(%d,N);
for( i = 0; i N; i++ )
a[i]=rand();
printf(产生的%d个随机数为:\n,N);
fprintf(fp,产生的%d个随机数为:\n,N);
for(i=0;iN;i++)
{
printf( %10d,a[i]);
fprintf(fp, %d,a[i]);
}
3.2 快速排序算法的实现
快速排序(Quick Sort)是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
假设待排序列为{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的值。即把序列分割成了两个子序列。
然后在分别对分割所得的两个子序列进行递归形式快速排序算法。最后即可得到一个有序的序列。
具体代码如下:
int a[10001];
int Partition(int low1,int high1)
{
int p,q;
int pivokey=a[low1];
while(low1high1)
{
while(low1high1a[high1]=pivokey)
high1--;
if(low1high1)
{
p=a[low1];
a[low1]=a[high1];
a[high1]=p;
low1=low1+1;
}
while(low1high1a[low1]=pivokey)
low
您可能关注的文档
最近下载
- QC∕T 1035-2016 汽车发动机用电子节气门体.pdf
- 五年级信息技术苏科版教案.pdf VIP
- 大肠埃希菌的药物治疗.pptx VIP
- 设计研发合同范本5篇.docx VIP
- TGMT操作手册OperatingManualTGMT操作手册.doc VIP
- 《产品成功从偶然到必然——IPD集成产品研发体系全景实战》-祝勇.pptx VIP
- Abaqus仿真分析培训教程及abaqus中文培训.ppt VIP
- 剑桥(join in)版五年级英语上册教学课件Starter unit (1) 课件.pptx VIP
- 市政管网工程量计算表(EXCEL)-xls491.xls VIP
- 中联T7530-20T塔吊说明书操作手册.pdf VIP
文档评论(0)