while(arr[j]>=temp&&i
while(arr[i]
<=temp&&i
這裡兩個while的順序是不能改變的,想一想:
假設對如下進行排序:
如上圖,6在左,9在右 我們將6作為基數。
假設從左邊開始(與正確程式正好相反)
於是i 就會移動到現在的 數字 7 那個位置停下來,而 j 原來在 數字 9 那個位置 ,因為
while(arr[j]>=temp&&i
於是,j 也會停留在數字7 那個位置,於是問題來了。當你最後交換基數6與7時,不對呀!!。
問題在於當我們先從在邊開始時,那麼 i 所停留的那個位置肯定是大於基數6的,而在上述例子中,為了滿足 i < j, 於是 j也停留在7的位置
但最後交換回去的時候,7就到了左邊,不行,因為我們原本 交換後數字6在邊應該是全部小於6,右邊全部大於6.但現在不行了。
於是,我們必須從右邊開始,也就是從基數的對面開始。
個人理解 關於啊哈演算法裡面快速排序為什麼從右邊開始
書上沒寫 我自己想了想 簡單說下吧 快速排序 使得基準數左邊全是小於基準數 右邊全是大於基準數 主要是基準數 是取左邊第乙個的 先說左邊開始為什麼不可以 就像上面的這個例子 按左邊開始會發生什麼?結果應該是7和6交換了 如果迴圈結束 i!j 那麼基準值就會覆蓋到left的位置 問題來了 如果righ...
快速排序(啊哈演算法)
include include using namespace std int a 101 n void quicksort int left,int right quicksort 1,n for i 1 i n i while arr i temp ii 這裡兩個while的順序是不能改變的,想...
快速排序(啊哈演算法)
include include using namespace std int a 101 n void quicksort int left,int right quicksort 1,n for i 1 i n i while arr i temp ii 這裡兩個while的順序是不能改變的,想...