這裡兩個while的順序是不能改變的,想一想:
假設對如下進行排序:
如上圖,6在左,9在右 我們將6作為基數。
假設從左邊開始(與正確程式正好相反)
while (nums[i] <= index && i < j)按照這個**邏輯,走一遍,i 就會移動到現在的 數字 7 那個位置停下來,而 j 原來在 數字 9 那個位置while (nums[j] >= index && j > i)
於是,j 也會停留在數字7 那個位置,然後 i == j了,這時候交換基準數和nums[i]
交換後的陣列為:7 1 2 6 9
這時候,你會發現問題來了,這結果不對呀!!!
問題在於當我們先從在邊開始時,那麼 i 所停留的那個位置肯定是大於基數6的
而在上述例子中,為了滿足 i不行,因為我們原本 交換後數字6在邊應該是全部小於6,右邊全部大於6,但現在不行了。
所以,我們必須從右邊開始,也就是從基準數的對面開始。
**:
快速排序 從右邊開始
先給出快速排序的 void quicksort vector nums,int left,int right nums left nums i nums i temp quicksort nums,left,i 1 quicksort nums,i 1,right 以nums left 作為基數te...
快排從右開始的原因
當我們把基準值設定在左邊時,為什麼要從右邊先開始找?乙個陣列為 6 1 2 7 9 3 4 5 10 8 先從右往左 前面幾輪查詢不貼了,到i j時與基準數進行交換,交換之後保證左邊的數都小於基準值右邊的數都大於基準值 從左往右 從有問題開始 i繼續前行當i j時此時值為9,但是條件限制j不能繼續前...
從排序開始(二) 希爾排序
希爾排序,是對直接插入排序的改進版本,又稱增量縮小排序,實質上是一種分組插入排序。基本思想是 先取第乙個增量step,以該序列內所有下標相差 step 的元素作為一組,如 array 0 array 0 step array 0 step 2 作為一組,array 1 array 1 step ar...