排序之二(快速排序及随机化)

来源:互联网 发布:php pdf完整版 编辑:程序博客网 时间:2024/05/01 03:32
  1. 快速排序

    快排思想:快速排序是分治法的另一个重要应用。和归并的算法思想一样,也以分治思想为基础,不同之处在于划分的标准不同。归并以数组元素个数进行划分,将原数组划分为两个元素个数相当的子问题。快速排序则以关键字进行划分,将原数组划分为两部分,一部分比关键字小,另一部分比关键字大。
    设计思想:分治法。
    注意细节
    • 实现细节上对于关键字的选择,一是以最小下标元素,二是以最大下标元素为关键字,三可以选择最小、最大、中间元素中值为中间值的元素,四是随机选择关键字。
    • 划分的比较时可以从一边直到另一边,也可以交替的在两边进行比较,最终找到关键字的正确位置。

    复杂度分析:

    空间复杂度:用于元素交换的空间为O(1),但是由于递归的栈空间需要O(n),最好情况也要O(lgn)。

    时间复杂度:最好情况,划分在正中央,划分后每个子问题的规模为原问题的一半,这时候为O(nlgn);最坏情况,划分为“斜的”(如:为正序或反序时),每次有一边只有一个元素,这时为O(n^2);按任意固定比例来划分原数组,比如:1/10,9/10,即每次划分都一边占1/10,一边占9/10,则和对半划分的效果一样,也是O(nlgn),只是常数因子可能会大一些;平均时间的计算使用随机化方法,结果为O(nlgn)。

    稳定性:
    不稳定。原因在于,如果选择关键字刚好为其中一个,则在比较的时候,会调换这两个元素的位置。这个不能由比较是否为严格大于来解决,因为被选的键可能是数组位置小的元素,也可能是数组位置大的元素。
    原地性:快排为原地排序。

    应用场景

    元素的排序情况是随机的;快排在元素数量较大时比其他排序算法一般有较好的性能。

  2. 随机化算法

    示性函数:概率中的示性函数定义。示性函数在随机化中的应用。

    快排时间复杂度:如果划分的情况是最好情况,最差情况交替的出现,则最后的复杂度也是O(nlgn)。

  3. 随机化快排
    由于快排随机化情况下比较好,为了解决已排序时复杂度较高的问题,因此在选择主元关键字时随机选择,从而将问题进行随机化。这种情况下,输入数据不再影响排序的复杂度。因此随机化快排能达到平均值O(nlgn)。
原创粉丝点击