算法导论 第七章 快速排序
来源:互联网 发布:手机贷款软件 编辑:程序博客网 时间:2024/05/21 00:55
快速排序
快速排序通常是实际应用中最好的选择,因为它的平均性能非常好,它的期望时间复杂度为O(nlng), 而且隐含的常数因子非常小。另外,它还是原址排序。
7.1 快速排序的描述
QUICKSORT(A, p, r) if p<r q=PARTITION(A, p, r) QUICKSORT(A, p, q-1) QUICKSORT(A, q+1, r)PARTITION(A, p, r) x=A[r] i=p-1 for j=p to r-1 if A[j]<=x i=i+1 exchange A[i] with A[j] exchange A[i+1] with A[r] return i+1
随着程序的执行,数组被划分为4个(小于主元,大于主元,未划分,主元,可能有空的)区域。对于PARTITION中的第3~6行,for循环的每一轮迭代的开始,每一个区域都满足一定的性质,我们可以将这些性质作为循环不变量:
- 若p<=k<=i,则A[k]<=x
- 若i+1<=k<=j=1,则A[k]>x
- 若k=r,则A[k]=x
对于PARTITION函数,想象一下这个过程,j在不断的向后跑去看各个元素,i则停留在了大于x的元素的前面,当j找到了一个比x小的元素的时候,我们就将这个比x小的元素和i+1位置上比x大的元素进行交换,然后在进行j的下一次迭代的时候,这样确保了1~i的所有元素全部是小于等于x的,而i+1~j的元素全部都是大于x的,j到r的元素还没有进行排序。
7.2 快速排序的性能
快速排序的运行时间依赖于划分是否平衡,二平衡与否又依赖于划分的元素。如果划分是平衡的,则性能于归并排序一样。如果划分是不平衡的,则性能接近于插入排序。
7.3 快速排序的随机化版本
在讨论快速排序的平均情况性能的时候,我们的前提假设是:输入数据的所有排列都是等概率的。但实际工程中这并不总是成立的。有时我们可以引入随机性,从而使得算法对于所有的输入都能获得较好的期望性能。很多人都选择随机化版本的快速排序。
我们通过显式地对输入进行重新排列,使得算法实现随机化。
RANDOMIZED-PARTITIOIN(A, p, r) i=RANDOM(p, r) exchange A[r] with A[i] return PARTITION(A, p, r)RANDOMIZED-QUICKSORT(A, p, r) if p<r q=RANDOMIZED-PARTITION(A, p, r) RANDOMIZED-QUICKSORT(A, p, q-1) RANDOMIZED-QUICKSORT(A, q+1, r)
0 0
- 算法导论:第七章 快速排序
- 算法导论读书笔记 第七章 快速排序
- 算法导论第七章:快速排序
- 【算法导论】第七章之快速排序
- 算法导论 第七章:快速排序
- [算法导论]第七章《快速排序》
- 算法导论第七章___快速排序
- 算法导论第七章总结:快速排序
- 算法导论 第七章:快速排序(Quicksort)
- 算法导论第七章 -- 快速排序
- 算法导论第七章-快速排序-c++
- 算法导论 第七章 快速排序
- 算法导论-第七章快速排序
- 算法导论第七章(快速排序)
- 算法导论 第七章快速排序与随机快速排序
- 算法导论 第七章快速排序与随机快速排序
- 算法导论 第七章快速排序与随机快速排序
- 算法导论学习笔记-第七章-快速排序
- 《数据挖掘概念与技术》第二版 中文版 第一章答案
- 谈谈互联网后端基础设施
- 基础7
- Struts2框架调试时,控制台打印输出大量<mime-mapping>相关信息,解决方法
- JDK卸载官方文档
- 算法导论 第七章 快速排序
- WebSphere注意事项之equals和==(1)
- Mybatis的ResultMap的使用
- 耗时近一个月,终于录完了VUE.JS2.0前端视频教程!
- eclipse汉化
- php有以下输出语句:
- 自定义动态圆形ProgressBar_(二)
- SQL语句优化方案
- Java 异常处理的误区和经验总结