快速排序法為什麼一定要從右邊開始的原因

2021-09-03 02:48:42 字數 659 閱讀 5150

這裡兩個while的順序是不能改變的,想一想:

假設對如下進行排序:

如上圖,6在左,9在右  我們將6作為基數。

假設從左邊開始(與正確程式正好相反)

while (nums[i] <= index && i < j) 

while (nums[j] >= index && j > i)

按照這個**邏輯,走一遍,i 就會移動到現在的 數字 7 那個位置停下來,而  j 原來在 數字 9 那個位置

於是,j 也會停留在數字7 那個位置,然後 i == j了,這時候交換基準數和nums[i]

交換後的陣列為:7 1 2 6 9 

這時候,你會發現問題來了,這結果不對呀!!!

問題在於當我們先從在邊開始時,那麼 i 所停留的那個位置肯定是大於基數6的

而在上述例子中,為了滿足 i不行,因為我們原本 交換後數字6在邊應該是全部小於6,右邊全部大於6,但現在不行了。

所以,我們必須從右邊開始,也就是從基準數的對面開始。

啊哈演算法關於快速排序法為什麼一定要從右邊開始的原因

while arr j temp i while arr i temp i 這裡兩個while的順序是不能改變的,想一想 假設對如下進行排序 如上圖,6在左,9在右 我們將6作為基數。假設從左邊開始 與正確程式正好相反 於是i 就會移動到現在的 數字 7 那個位置停下來,而 j 原來在 數字 9 那...

快速排序裡層while迴圈一定要從右邊開始?

如果使用遞迴實現快速排序。涉及到選取基數和兩層while迴圈 如下是選取基數為左邊。則裡層while迴圈應該右邊先開始 int target nums left while starttarget while left其實都可以。看你基數選取的位置 同理也可以選取右邊為基數字置 裡層while迴圈左...

快排為什麼一定要從右邊開始?

今天剛好同事問了下,為什麼以前背的快排一定要從右邊開始?剛好也順便給大家做個總結。其實快排沒有一定要重右邊開始,只是看你基數的位置,如果你基數選的是最左邊的。你一定要確保,你交換基礎的時候,保證那個數要小於基數。但是你重右邊開始,就無法保證了。比如你有 2 1 4 9 首先左邊left 會 跑到 4...