【算法导论】7.快速排序

快速排序的平均时间复杂度为O(nlgn),最坏时间复杂度为O(n^2),最坏时间复杂度出现在待排序列完全有序的状态,此时在使用分治法进行划分时,两个子序列的规模相差很大,就出现了最坏时间复杂度。快速排序由于其O(nlgn)前隐含的常数系数非常小,所以相比其它排序算法更快。


7.1快速排序的描述

快排使用了分治思想。

分解:将待排数组A[p..r]划分成两个(如果选取的划分元素不好,会导致其中一个为空)子数组A[p..q-1]和A[q+1..r],其中A[p..q-1]中的每个元素都小于等于A[q],A[q+1..r]中的每个元素都大于等于A[q]。计算下标q也属于划分过程的一部分。

解决:递归调用快排,对子数组A[p..q-1]和A[q+1..r]进行排序。

合并:由于子数组是原址排序,所以不需要合并。

快排的实现:

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]上的时间复杂度为O(n),n为子数组的长度。

(注意这个快排和数据结构课本中,有一个头指针和一个尾指针的快排不一样,这里用于标记两个子数组的指针,都是从下标p开始扫描数组。这里的终止条件是j从p扫描到r;使用头指针和尾指针的快排的终止条件是两个指针在数组中间相遇。最后对主元的处理,这里是将主元与最左的大于x的元素进行交换;另一种快排是将主元放在两个指针相遇的位置)。

Partition(A,p,r)
{
    x=A[r];//这里选数组中最后一个值作为划分主元
    i=p-1;//i为待排数组左边的下标值
    for j=p to r-1
    {
        if A[j]<=x//把值正确的分在x的两边
        {
            i++;
            exchange A[i] with A[j];
        }
    }
    exchange A[i+1] with A[r];
    return i+1;
}

7.2快速排序的性能

快排的运行时间依赖于划分是否平衡(分治法的时间复杂度),平衡依赖于用于划分的元素。如果划分的平衡,快排的算法性能与归并排序一样,如果不平衡,退化成插入排序。

1.最坏情况的划分:两个子问题分别包含n-1个元素和0个元素。并且每次递归调用都出现这种不平衡划分。此时快排的时间复杂度为O(n^2),插入排序的时间复杂度为O(n)。

2.最好情况的划分:Partition得到的两个子问题的规模都不大于n/2. 此时时间复杂度为O(nlgn).

3.平衡的划分:快排的平均运行时间更接近于其最好情况。只要划分是常数比例,算法的运行时间总是O(nlgn).

4.对于平均情况的直接观察:快排的行为依赖于输入数组中元素的值的相对顺序,而不是某些特定值本身。当好和差的划分交替出现时,快排的时间复杂度与全是好的划分一样,为O(nlgn)。(影响前面的系数,不影响问题的规模)。


7.3快排的随机化版本

由于实际问题中,不会像假设中“输入数据的所有排列都是等概率的”。所以可以通过在算法中引入随机性,从而使算法对于所有的输入都有较好的期望性能。

采用随机抽样的随机化技术,从子数组A[p..r]中随机选择一个元素作为主元。实现方法:首先将A[r]与从A[p..r]中随机选出的一个元素进行交换。通过对序列p...r的随机抽样,可以保证主元x=A[r]是等概率地从子数组的r-p+1个元素中选取的。由于是随机选取的主元,我们期望在平均情况下,对输入数组的划分是较为均衡的。

在新的划分中,需要在真正进行划分前进行一次交换:

Randomized-QuickSort(A,p,r)
{
    i=Random(p, r);//从p...r这些下标中随机选取一个
    exchange A[i] with A[r];
    return Partition(A,p,r);
}

之后进行排序:

Randomized-QuickSort(A,p,r)
{
    if p<r
    {
        q=Randomized-Partition(A,p,r);//和普通快排的区别就在于这个A[r]和前面不一样
        Randomized-QuickSort(A,p,q-1);
        Randomized-QuickSort(A,q+2,r);
    }
}

猜你喜欢

转载自blog.csdn.net/Chen_Swan/article/details/85877777