『算法导论』第 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)$。


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

查看所有标签

猜你喜欢:

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

设计模式

设计模式

[美] Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides / 李英军、马晓星、蔡敏、刘建中 等 / 机械工业出版社 / 2000-9 / 35.00元

这本书结合设计实作例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。书中分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。此书适合大学计算机专业的学生、研究生及相关人员参考。 书中涉及的设计模式并不描述新的或未经证实的设计,只收录了那些在不同系统中多次使用过的成功设计。一起来看看 《设计模式》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具