ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:31.68KB ,
资源ID:13602811      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/13602811.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法排序问题实验报告Word文件下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法排序问题实验报告Word文件下载.docx

1、 快速排序算法的基本思想是,通过一趟排序将待排序序列分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序序列为数组 A1.n,首先选取第一个数 A0,作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比 A0大的数都排在它的位置之前,将所有比 A0小的数都排在它的位置之后,由此以 A0最后所在的位置 i 作为分界线,将数组 A1.n分成两个子数组 A1.i-1和 Ai+1.n。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A1.i-1和 Ai+1.n排序。 一趟快速排序算法的伪代码称为 Pa

2、rtition,它的参数是一个数组 A1.n和两个指针 low、high,设枢轴为 pivotkey,则首先从 high 所指位置起向前搜索,找到第一个小于pivotkey 的数,并将其移到低端,然后从 low 所指位置起向后搜索,找到第一个大于 pivotkey 的数,并将其移到高端,重复这两步直至 low=high。最后,将枢轴移到正确的位置上。用伪代码表示一趟快速排序算法如下:Partition ( A, low, high)A0Alow/用数组的第一个记录做枢轴记录privotkeyAlow/枢轴记录关键字while low=privotkey do highhigh-1AlowAhi

3、gh /将比枢轴记录小的记录移到低端 Alow=pivotkey) do lowlow+1AhighAlow /将比枢轴记录大的记录移到高端AlowA0 /枢轴记录到位return low /返回枢轴位置2、算法的理论分析1. 直接插入排序算法理论分析从空间来看,直接插入排序只需要一个数的辅助空间;从时间来看,直接插入排序的基本操作为:比较两个关键字的大小和移动记录。先分析一趟直接插入排序的情况。伪代码InsertionSort 中 while 循环的次数取决于待插入的数与前 i-1 个数之间的关系。若 AiA0,则在 while 循环中,待插入数需与有序数组 A1.i-1中 i-1 个数进行

4、比较,并将 Ai-1中 i-1 个数后移。则在整个排序过程(进行 n-1 趟插入排序)中,当待排序数组中数按非递减有序排列时,则需进行数间比较次数达最小值 n-1,数不需要移动;反之,当待排序数组中数按非递增有序排列时,总的比较次数达最大值(n+2)(n-1)/2,数移动的次数也达到最大值(n+4)(n-1)/2。若待排序数组是随机的,即待排序数组中的数可能出现的各种排序的概率相同,则我们可取上述最小值和最大值的平均值,作为直接插入排序时所需进行数间的比较次数和数的移动次数,约为 n2/4。因此直接插入排序算法,在最佳情况下的时间复杂度是 O(n),在最坏情况下的时间复杂度为 O(n2)。2.

5、 快速排序算法理论分析下面我们来分析快速排序的平均时间性能。 假设 T(n)为对 n 个记录 A1.n进行快速排序所需时间,则由算法 QuickSort 可见:其中,Tpass(n)为对 n 个记录进行一趟快速排序 Partition(A,1,n)所需的时间,从一趟快速排序算法可见,其和记录数 n 成正比,可以用 表示(c 为某个常数);T(k-1)和 T(n-k)分别为对 A1.k-1和 Ak+1.n中记录进行快速排序 QuickSort(A,1,k-1)和QuickSort(A,k+1,n)所需时间。假设待排序列中记录是随机排列的,则在一趟排序之后,k 取 1 至 n 之间任何一值的概率相

6、同,快速排序所需时间的平均值则为Tavg(n)=knInn,其中 n 为待排序序列中记录的个数,k 为某个常数。 通常,快速排序被认为是,在所有同数量级(O(nlogn)的排序方法中,其平均性能最好。但是,若初始记录序列按关键字有序或基本有序时,快速排序将蜕化为起泡排序,其时间复杂度为 O(n2)。3、试验分析1、试验环境WIN 32系统,VC6.02、 程序的执行1)由函数 datagenetare()生成 20000 个在区间1,100000上的随机整数,并将随机整数保存到数组 num,接着调用函数 WriteFile()将这些数输出到外部文件 data.txt 中。2)调用函数 Read

7、File()从 data.txt 中读取数据,并将其保存到数组 num1中。接着对数组 num1 进行直接插入排序,并计算和记录其运行时间。最后,调用函数 WriteFile()将直接插入排序的结果写入 resultsIS.txt,并记录运行时间为 TimeIS。3)调用函数 ReadFile()从 data.txt 中读取数据,并将其保存到数组 num2中。接着对数组 num2 进行快速排序,并计算和记录其运行时间。最后,调用函数 WriteFile()将快速排序的结果写入 resultsQS.txt,并记录运行时间为 TimeQS。3、试验数据当N=20000时:当N=30000时:当N=

8、40000时:当N=50000时:当N=60000时:当N=70000时:当N=80000时:4、实验结果分析20000300004000050000600007000080000插入排序0.3250.7191.3972.1993.054.5715.46快速排序0.0030.0050.0080.010.0120.0110.013做出折线统计图4、试验心得通过本次试验首先对在C+下的文件操作有了一定的深入认识,对于快速排序和插入排序的时间有了相当清晰且一目了然的认识,并且从原理上明白了快速排序的快的原因,对各种排序算法的优劣性有了全局的认识!5、实验代码#include ctimecstdlib

9、fstreamstringusing namespace std;const int NumS = 80000;void datagenetare(int num,int n); /产生随机数,保存到数组numvoid WriteFile(int num,char name,int n); /输出数组num到data.txt文件void ReadFile(int num,char name);/读取名为name文件中的数据,保存到数组numvoid QuickSort(int arr, int n);/将数组arr中数据快速排序void InsertionSort(int arr,int n)

10、;/将数组arr中数据直接插入排序int main() int *num=(int *)malloc(sizeof(int)*NumS); int *num1=(int *)malloc(sizeof(int)*NumS); int *num2=(int *)malloc(sizeof(int)*NumS); clock_t start_time1,end_time1,start_time2,end_time2; double timeQS=0,timeIS=0; coutCreate NumS random numbers from 1 to 100000endl; datagenetare

11、(num,NumS); WriteFile(num,data.txt,NumS); /输出数组到data.txt文件 cout.precision(6); /设置浮点数的显示精度 cout.setf(ios_base:showpoint); /输出末尾的 /直接插入排序的分析 ReadFile(num1,);/读取data.txt中的数据,保存到数组num1nInsertionSort Start .n; start_time1=clock(); /开始计时 InsertionSort(num1,NumS); /直接插入排序数组num1中的数据 end_time1=clock(); /结束计时

12、 timeIS=(double)(end_time1-start_time1)/CLOCKS_PER_SEC;The Time-comsuption in InsertionSort is timeIS seconds!nn /输出运行时间 WriteFile(num1,resultsIS.txt /排序后的数据输出到resultQS.txt /输出运行时间timeIS到resultsIS.txt ofstream ocout; ocout.open(,ios:app); if(ocout.good() /打开resultsIS.txt ocoutnThe Time-comsuption in InsertionSort is secondsn ocout.close(); else coutnCan not open resultsIS.txt!n exit(1); /异常退出 /快速排序的分析 ReadFile(num2, /读取data.txt中的数据,保存到数组num2QuickSort Start .n start_time2=clock(); QuickSort(num2,NumS); /快速排序数组num中的数据 end_time2=clock(); timeQS=(double)(end_time2-start_time2)/CLOCKS_

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

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