說起快排的Python實現,首先談一下,快速排序的思路:
1、取一個參考值放到列表中間,初次排序后,讓左側的值都比他小,右側的值,都比他大。
2、分別對左側和右側的部分遞歸第1步的操作
實現思路:
- 兩個指針left,right分別指向列表的第一個元素和最后一個元素,然后取一個參考值,默認為第一個列表的第一個元素list[0],稱為K
- 然后left指向的值先和參考值K進行比較,若list[left]小於或等於K值,left就一直向右移動,left+1,直到移動到大於K值的地方,停住
- right指向的值和參考值K進行比較,若list[right]大於K值,right就一直向左移動,right-1,直到移動到小於K值的地方,停住
- 此時,left和right若還沒有相遇,即left還小於right,則二者指向的值互換
- 若已經相遇則說明,第一次排序已經完成,將list[right]與list[0]的值進行互換,進行之后的遞歸
編程實現:
1 #快排的主函數,傳入參數為一個列表,左右兩端的下標 2 def QuickSort(list,low,high): 3 if high > low: 4 #傳入參數,通過Partitions函數,獲取k下標值 5 k = Partitions(list,low,high) 6 #遞歸排序列表k下標左側的列表 7 QuickSort(list,low,k-1) 8 # 遞歸排序列表k下標右側的列表 9 QuickSort(list,k+1,high) 10 11 def Partitions(list,low,high): 12 left = low 13 right = high 14 #將最左側的值賦值給參考值k 15 k = list[low] 16 #當left下標,小於right下標的情況下,此時判斷二者移動是否相交,若未相交,則一直循環 17 while left < right : 18 #當left對應的值小於k參考值,就一直向右移動 19 while list[left] <= k: 20 left += 1 21 # 當right對應的值大於k參考值,就一直向左移動 22 while list[right] > k: 23 right = right - 1 24 #若移動完,二者仍未相遇則交換下標對應的值 25 if left < right: 26 list[left],list[right] = list[right],list[left] 27 #若移動完,已經相遇,則交換right對應的值和參考值 28 list[low] = list[right] 29 list[right] = k 30 #返回k值 31 return right 32 33 list_demo = [6,1,2,7,9,3,4,5,10,8] 34 print(list_demo) 35 QuickSort(list_demo,0,9) 36 print(list_demo)