排序算法(4)——快速排序

[转载] 《算法导论》

1、快速排序的思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
这里写图片描述

2、快速排序的实现

void swap(int *data1, int *data2)
{
    int tmp;
    tmp = *data1;
    *data1 = *data2;
    *data2 = tmp;
}

void QuickSort(int *array,int length)
{
    if (array == NULL || length < 2)
        return;
    int indexSmall = -1; //从前往后寻找
    int index=0;
    while (index < length-1)
    {
        if (array[index] < array[length - 1]) //参考元素选最后一个
        {
            indexSmall++;
            if (indexSmall != index)
                swap(array + indexSmall, array + index);
        }
        index++;
    }
    indexSmall++;
    swap(array + indexSmall, array + length - 1);

    QuickSort(array, indexSmall);
    QuickSort(array + indexSmall + 1, length - indexSmall - 1);

}

2、快速排序的性能

1)、时间复杂度
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况是O(n^2)。当每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。

最好情况下O(nlgn)。当每次划分所取的基准都是当前无序区的”中值”记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:

它的平均时间复杂度为O(nlgn)。尽管快速排序的最坏时间为O(n^2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。

2)、稳定性
快速排序是不稳定的。

和其它层算法的比较:
快速排序和冒泡排序都是基于比较的排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章