1. 程式人生 > >排序––快速排序(二)

排序––快速排序(二)

根據排序––快速排序(一)的描述,現準備寫一個快速排序的主體框架:

1、首先需要設定一個樞軸元素即setPivot(int i);

2、然後需要與樞軸元素進行比較即int comparePivot(int j); 

3、最後是關鍵步驟,將比樞軸元素大的排在右邊,小的排在左邊,然後對左右兩邊的數重複123的步驟,先進行以下幾種情況的討論:

    (1)假設給定序列7、6、5、4、3、2、1,並選擇4為樞軸,則示例程式碼如下:

sort(int from, int to) {

        if(from == to) {
            return;
        }
        int right = to;
        int left = from;
        while (true) {
            while (comparePivot(right) > 0) {
                right--;
            }

            while (comparePivot(left) < 0) {
                left++;
            }
            if (left == right) {
                break;
            }
            swap(left, right);
        }
        sort(from, left - 1);
        sort(right + 1, to);
    }

     驗證一下:7和1進行交換,序列變成1、6、5、4、3、2、7;left=0;right=6;

                      6和2進行交換,序列變成1、2、5、4、3、6、7;left=1;right=5;

                      5和3進行交換,序列變成1、2、3、4、5、6、7;left=2;right=4;

                      left=3;right=3;退出迴圈

                      然後分別呼叫sort(0,2),sort(4,6),對於sort(0,2)的排序過程如下:

                       假設選取2為樞軸,由於原始序列已經有序,right=1;left=1;退出迴圈。 最後的兩個遞迴是sort(0,0)以及sort(2,2),這兩個遞迴會由於from==to條件直接退出。

                      sort(4,6)也是類似的情況。

                    最後整個序列就是有序序列,由此看來該程式貌似正確,但是此情況比較特殊,為了能適應一般的情況,還需改進。其實正確的快速排序程式碼量很少,但是要把各種情況分析到位,寫一個正確的快速排序程式碼個人認為起碼沒有其它排序演算法那麼簡單。下篇再繼續分析排序過程中可能會出