快速排序算法簡述及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:所寫都是學習筆記,非原創,但理解,不知道為什麼代碼老是在上面