快速排序(Quick Sort)小结

来源:互联网 发布:网络控制系统 编辑:程序博客网 时间:2024/06/06 17:15

什么是快速排序?

       简单概括,快速排序是每次选择一个主元(pivot element),以主元为参考,将序列分成两拨(一拨大于,一拨小于等于),并将主元放置到其正确的位置上,这就是快速排序。

优点:

       (1)虽然最坏情况时间复杂度不算好,但通常却是实际情况中最好的选择,主要原因是:平均性能好,且常数因子小;

       (2)原址排序

效率:(该算法效率依赖于每次选择的主元是否对序列进行了均衡的划分,因为该算法与归并排序类似,利用了分治思想

       (1)如果划分平衡(哪怕99:1也不要紧),效率与归并排序一样:

       (2)如果遇到最坏情况,每次都分得一个0数组,此时,快速排序的效率下降到与插入排序差不多,为:

快速排序的随机化版本:

       随机化版本,不用让每次输入的数组都是原数组的一个随机序列,因为决定快速排序的随机性的根本在于主元选择的随机性;在随机化版本中将随机选择数组中的一个元素作为主元,这样来实现随机化。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

伪代码:

//功能:对数组A中的下标范围为p到r的子数组进行快速排序QUICKSORT(A, p, r)1if p < r2q = PARTITION(A, p, r)3QUICKSORT(A, p, q - 1)4QUICKSORT(A, q + 1, r)//功能:将数组A中下标为p到r的子数组进行划分,返回划分点下标PARTITION(A, p, r)1x = A[r]//主元2i = p - 13for j = p to r - 14if A[j] <= x5i += 16exchange A[i] with A[j]7exchange A[i+1] with A[r]8return i + 1
C++代码实现:

#include <iostream>#include <vector>using namespace std;int partition(vector<int> &A, int p, int r){    int x = A.at(r);    int i = p - 1;    for(int j = p ; j < r ; ++j)    {        if(A.at(j) <= x)        {            i += 1;            int tmp = A.at(i);            A.at(i) = A.at(j);            A.at(j) = tmp;        }    }    int tmp = A.at(i+1);    A.at(i+1) = A.at(r);    A.at(r) = tmp;    return i+1;}void quickSort(vector<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);    }}int main(){    vector<int> A = {2, 8, 7, 1, 3, 5, 6, 4};    cout << "Initial array: ";    for(int i = 0 ; i < (int)A.size() ; ++i)    {        cout << A.at(i) << ", ";    }    cout << endl;    quickSort(A, 0, (int)A.size()-1);    cout << "Sorted array: ";    for(int i = 0 ; i < (int)A.size() ; ++i)    {        cout << A.at(i) << ", ";    }    cout << endl;    return 0;}
输出结果:


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

好了,这篇先到这里。

同志,加油!!!大笑

原创粉丝点击