- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 计算机算法设计与分析 * §2.8 快速排序 【问题描述】有n个数据(在此假设都是整数)存放于数组a中,即a[0]到a[n-1]中存放了n个整数。要求经过处理后,使得 a[0] ≤a[1] ≤, …, ≤a[n-1] 排序的方法很多,如选择、冒泡、插入、快速、归并、堆排序等。后三种排序方法中都用到了分治策略。 * 计算机算法设计与分析 * 快速排序的基本思想 通过一趟排序将待排整数分割成独立的两部分,其中前部分数均比后部分数小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 要做到这种“分块有序”,只要在a[low..high]中任选一个整数作为基准(T),以此基准将当前无序区划分为左、右两个较小的子区间a[low..T-1)和a[T+1..high],并使左边子区间中所有元素均小于等于基准(不妨记为T),右边的子区间中所有元素均大于等于它,而基准T则位于正确的位置上,它无须参加后续的排序。 * 计算机算法设计与分析 * 基准T该如何选择呢? 一种简单的方法就取待排序的区间[0..n-1]中的第一个元素a[0]作为基准。 然后保持原数组不动,另取一个等长的数组b,从b[0]开始往后存放小于基准的元素,从b[n-1]开始往前存放大于基准的元素,分组完成后把所有元素从b数组复制回a中,并记下两组的中间分隔位置,基准就在这个位置。 但这样的处理会造成存储空间上额外的开销,下面描述的方法可以在原数组a上进行分组,并找到基准的位置,只需要另外增加一个整型变量。 * 计算机算法设计与分析 * 51 33 62 98 87 27 18 75 46 初始序列: 51 33 62 98 87 27 18 75 46 low high 第一趟: 基准T 51 low high 46 low low 62 high high 18 low 98 high 27 low 87 high 51 第二趟: 27 33 18 46 51 62 75 87 98 第三趟: 18 27 33 46 51 62 75 87 98 * 计算机算法设计与分析 * 快速排序算法 快速排序的核心就是基准的定位,只要确定了基准的位置,它前后两部分就已经分块有序了——我们也把这个过程称为“划分”。再按同样的方法进行下去就可以了。 void qksort(int a[], low, high ) /* 对a[low..high]中的元素排序 */ {if (low high) { qkpass(a,low,high,*T); /*qkpass定位基准,并把基准的位置放在*T中*/ qksort(a,low,*T-1); qksort(a,*T+1,high); } } * 计算机算法设计与分析 * 下面是划分的过程: void qkpass(int a[], int low, int high, int *T); /*在a[low..high]中找基准位置,使得基准前面的元素均小于等于基准值, 基准后面的元素均大于等于基准值,基准所在的位置由*T返回。*/ { int temp; temp=a[low]; /*以第一个元素为基准值,并把这个位置腾出来*/ while (low high ) { while (low high a[high]≥temp) high=high-1; a[low]=a[high]; /* 找到一个比基准小的元素并把它放到空当*/ /*现在的空当在[high]处,如果不存在这样的元素,low=high*/ while (low high a[low]≤temp) low=low+1; a[high]=a[low]; /*找到一个比基准大的元素并把它放到空当*/ /*现在的空当重新回到[low]处,如果不存在这样的元素,low=high*/ } a[low]=temp; *T=low; /*记录下基准的位置*/ } * 计算机算法设计与分析 * 快速排序的算法分析 快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。 * 计算机算法设计与分析 * 1.最坏情形的时间复杂度 最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的
文档评论(0)