快速排序核心思想是每趟調整基準值的位置,將小于基準值的數左移,將大于基準值的數右移,這樣確保基準值左側的數小于基準值,右側的數大于基準值,在下一趟時,調整上一趟分割的兩個區域的基準值位置,直到最后完成所有基準值的調整,
調整基準值的前提是選擇一個合理的基準值,一般是指定某個位置的數或者隨機某個位置的數作為基準值(我這里取每個區域的第一個數),
調整基準值的程序大概描述:
1、取第一個數作為基準值,宣告從前往后搜索指標 i ,從后往前搜索指標 j ;
2、從后往前找,比基準值大則指標 j 減一,直到找到一個比基準值小的數,并和基準值交換(交換完后此時基準值的位置在 j );
3、從后往前查找結束再從前往后找,比基準值小則指標 i 加一,直到找到一個比基準值大的數,并和基準值交換(交換完后此時基準值的位置在 i );
4、當指標 i 等于 j 時,結束當前趟數基準值的調整,
待排序的陣列如下:

調整基準值的程序我舉個例子吧:
第一趟基準值key取72,i=0,j=8;
從后往前找,找到一個比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;
所以第一趟結束后的陣列排列是:

查找基準值的思路大概是這樣子,條理清晰之后,剩下的也就是重復上面的操作了,因此代碼寫起來就比較簡單了,
調整基準值代碼的具體實作:

每趟找到基準值的位置后,對基準值左邊的資料和右邊的資料進行基準值的調整,直到最后沒有可調整的資料,那也就排完序了,
具體代碼實作:

所以最后輸出的陣列就是排好序的陣列了,
關注公眾號 吃菜長肉
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/116940.html
標籤:其他
上一篇:C#網路傳輸
