中科大软件学院算法实验报告摘要.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法实验报告 快速排序 1. 问题描述: 实现对数组的普通快速排序与随机快速排序 (1)实现上述两个算法 (2)统计算法的运行时间 (3)分析性能差异,作出总结 2. 算法原理: 快速排序快速排序是对冒泡排序的一种改进。它的基本思想是:通过一排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要,然后再按方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 3)从j开始向前有哪些信誉好的足球投注网站,即由后开始向前有哪些信誉好的足球投注网站(j--),找到第一个小于key的值A[j],将A[j]赋给A[i]; 4)从i开始向后有哪些信誉好的足球投注网站,即由前开始向后有哪些信誉好的足球投注网站(i++),找到第一个大于key的A[i],将A[i]赋给A[j]; 5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。 随机快速排序 快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。 本实验采用对80000个随机数据十次排序,并取出平均值。分别普通快速排序和随机快速排序数据排序。作为运行,观测两种算法所用的时间的不同。截图 所示的时间,快速排序所用的平均为,随机化版本的快速排序所用时间仅仅为。 5. 结果分析 分析实验截图得到的结果来看,随机化版本的快速排序所用时间快速排序所用的平均。 排序的平均时间复杂度为O(nlogn)最坏时间时间可达到O(n^2)最坏情况是当要排序的数基本有序的时候。根据排序的工作原理我们知道,选取第一个一个元素作为主元快速排序依次将数列分成两个数列,然后递归将分开的数列进行排序。把数列平均分成两个数列时,效率是最高的,如果相差太大,降低。 通过使用随机化的排序的从数列中选取一个元素与第一个,或者最后一个元素交换,这样使得数列有序的概率降低。 排序的平均时间复杂度为O(nlogn)最坏时间时间会达到O(n^2)已经降得很小。 分析快速排序随机快速排序在对序列的操作过程中只需花费常数级的空间。空间复杂度S(1)。 但需要注意递归栈上需要花费最少logn 最多n的空间#include iostream #include windows.h using namespace std; void QuickSort(int arr[],int lo,int hi) { //这里的lo和hi是数组的下标; if(lo=hi) {return;} int fi = lo;//0开始 int la = hi;//最大下标开始 int key = arr[fi]; while(fi la) { while(fila arr[la]=key) --la; arr[fi] = arr[la]; while(fila arr[fi]=key) ++fi; arr[la] = arr[fi]; } arr[fi] = key; QuickSort(arr,lo,fi-1); QuickSort(arr,fi+1,hi); } int main() { int arr[100000],n; cout请输入要排序的个数(您不能够超过100000个数字):endl; cinn; for(int i = 0;in;i++) { arr[i]=rand(); } FILETIME beg,end; GetSystemTimeAsFileTime(beg); QuickSort(arr,0,n-1); GetSystemTimeAsFileTime(end); for(int i= 0;in;i++) coutarr[i] ; coutendlendl; cout当输入n个数时,耗时:100*(end.dwLowDateTime-beg.dwLo

文档评论(0)

风凰传奇 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档