今天剛好同事問了下,為什麼以前背的快排一定要從右邊開始?剛好也順便給大家做個總結。
其實快排沒有一定要重右邊開始,只是看你基數的位置,如果你基數選的是最左邊的。你一定要確保,你交換基礎的時候,保證那個數要小於基數。但是你重右邊開始,就無法保證了。
比如你有
2 1 4 9 首先左邊left 會 跑到 4這裡,這樣9也會到4.然後進行交換。顯然就出錯了。 肯定不可能 4 1 2 9 所以為什麼不能左邊開始。
當你從右邊開始的時候,就一定是可以保證 那個數一定是小於等於基數的, 比如 上面就會找到 1 就會 1 2 4 9 這樣2 歸位。
或者說最不濟的情況, 找不到小於基數的 。 比如 2 3 4 9 。 右邊開始,這樣也會定位到2的本身, 頂多這次交換是 2 和2 的交換。 2 3 4 9 。
明白了嗎 ? 主要就是從左邊開始,你不能保證你最後交換的那個數,是小於等於左邊的。
如果你硬是要從左邊開始,那麼你的基數就選右邊的把 。
快速排序法為什麼一定要從右邊開始的原因
這裡兩個while的順序是不能改變的,想一想 假設對如下進行排序 如上圖,6在左,9在右 我們將6作為基數。假設從左邊開始 與正確程式正好相反 while nums i index i j while nums j index j i 按照這個 邏輯,走一遍,i 就會移動到現在的 數字 7 那個位置...
啊哈演算法關於快速排序法為什麼一定要從右邊開始的原因
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迴圈左...