1. 程式人生 > 其它 >快速排序優化方案的否定

快速排序優化方案的否定

記得曾參考教材與幾篇部落格,最終寫出自己的快速排序終極版。
詳情可見 排序系列
最終的版本大概是下面這個樣子。

 1 int Partition(int first, int end) {
 2     //此處選擇數列第一個記錄作為基準
 3     int tmp = r[first];
 4     while (first < end) {
 5         while (first < end&&r[first] <= r[end])end--;//終點位置的記錄滿足大於基準記錄,則終點位置前移
 6         if (first < end) {
7 r[first] = r[end]; 8 first++;//基準位置交換後,r[first]=r[end]恆成立,故first++ 9 } 10 while (first < end&&r[first] <= r[end])first++;//起點位置的記錄滿足小於基準記錄,則起點位置後移 11 if (first < end) { 12 r[end] = r[first]; 13 end--;//基準位置交換後,r[first]=r[end]恆成立,故end--
14 } 15 //當取數列最後一個記錄作為基準時,上面兩個while迴圈交換順序 16 } 17 r[end] = tmp; 18 return end;//迴圈退出時,必定有first=end=partition 19 }

但是今天一個題目(輸出前k大的數)偶然間暴露了它的錯誤性。
題目隨意給了下面這樣一個整數序列示例:

4 5 6 9 8 7 1 2 3 0

當時就想拿著快排在紙上試一下(反正演算量也不大())
最後結果真是amazing啊!如下:

7 8 9 4 6 5 1 2 3 0

顯然end為4,但是按降序排列end應為6。
這裡甚至都不滿足基準左邊全部大於右邊。

所以相當於無意間發現這是一種錯誤的編碼方式

以後還是老老實實swap吧!(╹▽╹)