- 快速排序
快排思想:快速排序是分治法的另一个重要应用。和归并的算法思想一样,也以分治思想为基础,不同之处在于划分的标准不同。归并以数组元素个数进行划分,将原数组划分为两个元素个数相当的子问题。快速排序则以关键字进行划分,将原数组划分为两部分,一部分比关键字小,另一部分比关键字大。
设计思想:分治法。
注意细节:
- 实现细节上对于关键字的选择,一是以最小下标元素,二是以最大下标元素为关键字,三可以选择最小、最大、中间元素中值为中间值的元素,四是随机选择关键字。
- 划分的比较时可以从一边直到另一边,也可以交替的在两边进行比较,最终找到关键字的正确位置。
复杂度分析:
空间复杂度:用于元素交换的空间为O(1),但是由于递归的栈空间需要O(n),最好情况也要O(lgn)。
时间复杂度:最好情况,划分在正中央,划分后每个子问题的规模为原问题的一半,这时候为O(nlgn);最坏情况,划分为“斜的”(如:为正序或反序时),每次有一边只有一个元素,这时为O(n^2);按任意固定比例来划分原数组,比如:1/10,9/10,即每次划分都一边占1/10,一边占9/10,则和对半划分的效果一样,也是O(nlgn),只是常数因子可能会大一些;平均时间的计算使用随机化方法,结果为O(nlgn)。
稳定性:
不稳定。原因在于,如果选择关键字刚好为其中一个,则在比较的时候,会调换这两个元素的位置。这个不能由比较是否为严格大于来解决,因为被选的键可能是数组位置小的元素,也可能是数组位置大的元素。
原地性:快排为原地排序。
应用场景:
元素的排序情况是随机的;快排在元素数量较大时比其他排序算法一般有较好的性能。
-
随机化算法
示性函数:概率中的示性函数定义。示性函数在随机化中的应用。
快排时间复杂度:如果划分的情况是最好情况,最差情况交替的出现,则最后的复杂度也是O(nlgn)。
- 随机化快排
由于快排随机化情况下比较好,为了解决已排序时复杂度较高的问题,因此在选择主元关键字时随机选择,从而将问题进行随机化。这种情况下,输入数据不再影响排序的复杂度。因此随机化快排能达到平均值O(nlgn)。
排序之二(快速排序及随机化)
最新推荐文章于 2024-07-28 22:35:47 发布
