『算法导论』第 7 章:快速排序

栏目: 编程工具 · 发布时间: 5年前

内容简介:快速排序通常是实际排序应用中最好的选择。它在最坏情况下的时间复杂度很差,但是平均性能非常好。另外,它能够进行原址排序。与归并排序一样,快速排序也用到了分治思想。其主过程的代码如下:算法的关键是数组划分过程PARTITION,它实现了对子数组$A[p…r]$的原址重排。选择$x=A[r]$作为主元,围绕它来划分数组$A[p…r]$。完成划分后,$A[p…q-1]$的每一个元素都小于等于$A[q]$,而$A[q]$也小于等于$A[q+1…r]$中的每个元素。程序最后返回主元的新小标。代码如下:

快速排序通常是实际 排序 应用中最好的选择。它在最坏情况下的时间复杂度很差,但是平均性能非常好。另外,它能够进行原址排序。

快速排序的描述

与归并排序一样,快速排序也用到了分治思想。其主过程的代码如下:

void quicksort(int A[], int p, int r)
{
    if (p < r) {
        int q = partition(A, p, r);
        quicksort(A, p, q-1);
        quicksort(A, q+1, r);
    }
}

算法的关键是数组划分过程PARTITION,它实现了对子数组$A[p…r]$的原址重排。选择$x=A[r]$作为主元,围绕它来划分数组$A[p…r]$。完成划分后,$A[p…q-1]$的每一个元素都小于等于$A[q]$,而$A[q]$也小于等于$A[q+1…r]$中的每个元素。程序最后返回主元的新小标。代码如下:

void Exch(int *arr, int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

int partition(int A[], int p, int r)
{
    int x = A[r];
    int i = p - 1;
    for (int j = p; j < r; j++) {
        if (A[j] <= x) {
            ++i;
            Exch(A, i, j);
        }
    }
    Exch(A, i+1, r);
    
    return (i + 1);
}

PARTITION在子数组$A[p…r]$上的复杂度为$\Theta(n)$,其中$n=r-p+1$。

快速排序的性能

当划分产生的两个子问题分别包含了$n-1$个元素和$0$个元素时,快速排序的 最坏情况 就发生了。假设算法的每一次递归调用中都出现了这种不平衡划分,可以得到如下的递归式:

$$

T(n) = T(n-1) + T(0) + \Theta(n) = T(n-1) + \Theta(n)

$$

可以得到时间复杂度为$T(n) = \Theta(n^2)$,也就是说,最坏情况下,快速排序的运行时间并不比插入排序好。当输入数组已经完全有序时,快速排序的时间复杂度为$\Theta(n^2)$,而这种情况下插入排序的时间复杂度为$O(n)$。

在可能的最平衡的划分中,PARTITION得到的两个子问题的规模都不大于$n/2$,这便是快速排序的 最好情况 。运行时间的递归式为:

$$

T(n) = 2T(n/2) + \Theta(n)

$$

上述递归式的解为$T(n) = \Theta(n \lg n)$,通过在每一层递归中都平衡划分子数组,我们得到了渐近时间上更快的算法。

实际上,只要划分是常数比例的,算法的运行时间总是$O(n \lg n)$,即使是$99:1$的划分,其时间复杂度仍然是$O(n \lg n)$。当对一个随机输入的数组进行快速排序时,平均情况下,划分同时混合有“好”和“差”的划分。当好和差的划分交替出现时,快速排序的复杂度和全是好的划分时一样,仍然是$O(n \lg n)$,区别只在于隐含的常数因子要略大一些。

快速排序的随机化版本

前面的讨论基于一个前提:输入数据的所有排列都是等概率的。实际工程中并不总是这样的,所以我们可以通过在算法中引入随机性,从而使得算法对于所有的输入都能获得较好的期望性能。

可以从子数组$A[p…r]$中随机选择一个元素作为主元,这通过将$A[r]$与从$A[p…r]$中随机选出的一个元素交换来实现。由于主元元素是随机选取的,在平均情况下,对数组的划分是比较均衡的。代码略。

快速排序分析

本节用严格的数学推导计算了快速 排序算法 的运行时间。在输入元素互异的情况下,随机化版本的期望运行时间为$O(n \lg n)$。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CSS权威指南(第三版)

CSS权威指南(第三版)

[美] Eric A.Meyer / 侯妍、尹志忠 / 中国电力出版社 / 2007-10 / 58.00

你是否既想获得丰富复杂的网页样式,同时又想节省时间和精力?本书为你展示了如何遵循CSS最新规范(CSS2和CSS2.1)将层叠样式表的方方面面应用于实践。 通过本书提供的诸多示例,你将了解如何做到仅在一处建立样式表就能创建或修改整个网站的外观,以及如何得到HTML力不能及的更丰富的表现效果。 资深CSS专家Eric A.Meyer。利用他独有的睿智和丰富的经验对属性、标记、标记属性和实......一起来看看 《CSS权威指南(第三版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具