快速排序算法簡述及python的實現
- 2020 年 8 月 22 日
- 筆記
1 def kp(arr, i, j): 2 if i<j: #i=j時意味着一邊只剩單個數據 3 base = kpgc(arr, i, j) 4 kp(arr, i, base-1) #kp(arr, i, base)也可以,相當於把base放進去重新排了一遍,但是由於base大於左邊的,沒什麼影響 5 kp(arr, base+1, j) 6 7 def kpgc(arr, i, j): 8 base = arr[i] #第一個數字作為基準數字 9 while i < j: 10 if arr[j] >= base: #當活動指針j指向數據大於或等於基準數字時,該數據未發生交叉,放右邊, 11 j -= 1 #活動指針同時像左移 12 if arr[j] < base: #當活動指針j指向數據小於基準數字時,該數據發生交叉, 13 arr[i] = arr[j] #指向數據放左邊(此時arr[i]值已被賦給base) 14 i += 1 #i指針向右移 15 arr[j] = arr[i] #為了使活動指針一直在j處,直接將i處值賦到j指針處 16 arr[i] = base #將基準數字放至被分兩組之間 17 return i 將基準數字所處的索引(即位置)返回 18 19 arr = [1,3,7,8,5,6,3,4] 20 kp(arr,0,len(arr)-1) 21 print(arr)
快排算法簡述:
1,先從一組數字中任意取一個基準數字(我們以第一個數字為基準數字),將剩下數字以下列方式排在基準數字兩側,左/右側數字全小/大於基準數字
方式:除基準數字之外,指針i指向第一個數字位置,指針j指向最後一個數字位置,活動指針最開始指向j,
若r[j]大於或等於基準數字,則放於基準數字右側,j指針左移,活動指針仍在j處,
若小於,則放於左側,發生交叉位置互換,此時活動指針移到i處(活動指針在哪則比較哪個數字)
2,再將基準數字兩側數字分別重複1做法直到每側都為一個數字
python的實現
主要靠遞歸
為了減少活動指針移動的麻煩,這裡使用將i位置的值傳送到j處
ps:所寫都是學習筆記,非原創,但理解,不知道為什麼代碼老是在上面
