- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《数据结构》
课 程 设 计 报 告 书
题 目: 快速排序算法性能分析
系 别: 计算机科学与应用系
学 号: 081006211
学生姓名: 侯亚兵
指导教师: 刘双红
完成日期: 2010.6.10
快速排序算法性能分析
需求分析
首先,要求能够自动随机生成50、100、500、1000、5000、10000个数据,这些数据用数组a[N]存储并输出到屏幕上,同时把这些数据写入文件中,以供与输出相比较看是否排序正确。
其次,程序对数组a[N]进行快速排序,并且要记录快速排序运算运行的时间。
最后,输出部分将经过快速排序后的数组a[N]和快速排序运算运行时间格式化输出并且写入文件。
概要设计
程序流程如图1所示:
图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)
low1++;
if(low1high1)
{
q=a[high1];
a[high1]=a[low1];
您可能关注的文档
最近下载
- (YUM)百胜验厂审核详细要求清单.pdf VIP
- 四上数学口算竖式脱式应用题每日一练60天(60页).pdf VIP
- 《云南彝良地区地质构造特征探讨.docx VIP
- 三上数学口算竖式脱式应用题每日一练60天(60页).pdf VIP
- 2025年新青岛版数学三年级上册全册课件.pptx
- 《旅游客源地与目的地概况》教案 第1课 了解世界旅游业(一).pdf VIP
- 人教版劳动教育四年级上册全册教学设计.pdf VIP
- 2022年国家人体生物监测工作手册.pdf VIP
- 电子课件自主学习修订版第一单元开启自主学习的旅程.pptx VIP
- JBT 4333.2-2013 厢式压滤机和板框压滤机 第2部分:技术条件.pdf VIP
文档评论(0)