5分鐘搞定快速排序

快速排序核心思想是每趟調整基準值的位置,將小於基準值的數左移,將大於基準值的數右移,這樣確保基準值左側的數小於基準值,右側的數大於基準值。在下一趟時,調整上一趟分割的兩個區域的基準值位置,直到最後完成全部基準值的調整。數組

 

調整基準值的前提是選擇一個合理的基準值,通常是指定某個位置的數或者隨機某個位置的數做爲基準值(我這裏取每一個區域的第一個數)指針

調整基準值的過程大概描述:blog

一、取第一個數做爲基準值,聲明從前日後搜索指針 ,從後往前搜索指針 排序

二、從後往前找,比基準值大則指針 減一,直到找到一個比基準值小的數,並和基準值交換(交換完後此時基準值的位置在 );搜索

三、從後往前查找結束再從前日後找,比基準值小則指針 加一,直到找到一個比基準值大的數,並和基準值交換(交換完後此時基準值的位置在 );im

四、當指針 i  等於 j 時,結束當前趟數基準值的調整。數據

 

待排序的數組以下:db

 

調整基準值的過程我舉個例子吧:img

第一趟基準值key取72,i=0,j=8;co

從後往前找,找到一個比72小的值48,與72交換,此時i=0,j=7;

 

 

從後往前找並交換以後肯定了48是在72的左側了,那麼從前日後找的時候就不須要再判斷i位置上的元素了,因此i=i+1=1。再從i的位置日後找,找到一個比72大的值88,與72交換,此時i=2,j=7;

 

從前日後找並交換以後肯定了88是在72的右側了,那麼從後往前找的時候就不須要再判斷j位置上的元素了,因此j=j-1=6。再從j的位置往前找,找到一個比72小的值42,與72交換,此時i=2,j=4;

 

從後往前找並交換以後肯定了42是在72的左側了,那麼從前日後找的時候就不須要再判斷i位置上的元素了,因此i=i+1=3。再從i的位置日後找,此時沒有找到一個比72大的數,那麼當前趟結束,找到基準值的位置i=j=4;

因此第一趟結束後的數組排列是:

 

查找基準值的思路大概是這樣子,條理清晰以後,剩下的也就是重複上面的操做了,所以代碼寫起來就比較簡單了。

調整基準值代碼的具體實現:

 

每趟找到基準值的位置後,對基準值左邊的數據和右邊的數據進行基準值的調整,直到最後沒有可調整的數據,那也就排完序了。

 

具體代碼實現:

 

因此最後輸出的數組就是排好序的數組了。

 

關注公衆號 吃菜長肉

相關文章
相關標籤/搜索