快速排序算法

  • 算法思路:
    快速排序算法是基於分治策略的一種排序算法,它的思想是,對於輸入的子數組a[p,r],分別執行以下三個步驟:
    ①.分解(divide):以a[q]爲基準元素,將a[p,r]劃分爲三段a[p,q-1],a[q],a[q+1,r],使得a[p,q-1]中的任何元素都小於等於a[q],a[q+1,r]中的任何元素都大於等於a[q],q是在劃分過程中確定的。
    ②.遞歸求解(conquer):通過調用快速排序算法,分別對a[p,q-1]和a[q+1,r]進行排序。
    ③.合併(merge):由於a[p,q-1]和 a[q+1,r]是就地進行的,所以a[p,q-1]和a[q+1,r]都已排好的序後就不需要進行任何計算了,a[p,r]都已排好序。

  • 算法實現:

private static void qSort(int p,int r){
    if(p<r){
        int q=partition(p,r);
        qSort(p,q-1);
        qSort(q+1,r);
    }
}

private static int partition(int p,int r){
    int i=p;j=r-1;
    Comparabel x = a[p];
    /*
        將<x的元素交換到左邊區域
        將>x的元素交換到右邊區域
    */
    while(true){
        while(a[++i].compareTo(x)>0 && i<r);
        while(a[--j].compareTo(x)<0);
        if(i>=j) break;
        MyMath.swap(a,i,j);
    }
    a[p]=a[j];
    a[j]=x;
    return j;
}
  • 算法分析

①.最壞情況下時間複雜度(每次劃分所產產生的兩個區域分別包含n-1個元素和1個元素):

T(n)={O(1),T(n1)+O(n), 1> 1

解此遞歸方程可得T(n)=O(n2 ).

②.最好情況下時間複雜度(每次劃分所取的基準恰好爲中值,每次劃分都產生兩個大小爲n/2的區域):

T(n)={O(1),2T(n/2)+O(n), 1> 1

其解爲T(n)=O(nlogn).
③.平均情況下時間複雜度:
T(n)=O(nlogn).

註解:這個算法是基於比較排序算法中算的快速的,快速排序也因此而得名。

  • 算法優化:

    隨機化的劃分算法實現:

private static int randomizedPartition(int p,int r){
    /*
        快速排序算法的性能取決於劃分的對稱性。
        通過在a[p,r]中隨機選出一個元素作爲作爲劃分基準。
        從而使得劃分基準的選擇是隨機的,可以期望劃分是比較對稱的。
        random(p,r)產生p和r之間的一個隨機整數,且產生不同整數的概率相同。
    */
    int i = random(p,r);
    MyMath.swap(a,i,p);
    return partition(p,r);
}
private static void randomizedQuickSort(int p, int r){
    if(p<r){
        int q = randomizedPartition(p,r);
        randomizedQuickSort(p,q-1);//對左半段排序
        randomizedQuickSort(q+1,r);//對有半段排序
    }
}
發佈了40 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章