QQ:3020889729 小蔡
特別聲明
本文采用jupyter notebook演示,請注意移植代碼的整合問題。
排序優點
序號 | 優點 |
---|---|
1 | 時間和內存使用良好,排序效果好。(在小數據排序時,冒泡可以替換) |
2 | 是一種二分思想的體現,是二分堆排序學習的引導 |
算法思想
1.從一段需要排序的數據中選出基數
2.然後從兩邊開始按指定規則檢測:從左到右爲檢測比基數(4)大的數,然後停下;從右到左爲檢測比基數(4)小的數,然後停下。將這兩個交換後,繼續檢測操作——知道左右檢測到同一個元素時,將基數與該元素交換,即完成一輪元素快排。
3.從以上圖示可知,最終排序的數據會變成一個個確定的基數,進而完成排序。(算法實現採用遞歸完成,破除條件就是,左檢測的下標等於右檢測下標(不允許左檢測大於右檢測))
代碼實現
處理輸入數據
# 不定長數據排序
a = input("請輸入待排序數據:").split(' ')
a = [int(x) for x in a] # 數據類型轉換
n = len(a) # 數據長度
結果展示:
定義快排函數
提示:該函數調用全局的a變量
def quicksort(left, right): # 傳入快排的起止下標
'''函數說明:
1.函數內採用全局變量實現數據修改
2.遞歸破除條件爲左檢測越過右檢測時
3.每一次新劃分總是從左邊開始新的遞歸,再進行右部分的遞歸
'''
if left > right: # 遞歸破除條件:當左檢測標號left》right時,破出
return
i = left # 快排的左下標,也是基數的下標
j = right # 快排的尾下標
t = a[left] # 基數值
while i != j: # 進行快排
while a[j] >= t and i < j: # 每一次快排總是先從右邊開始檢測小於基數的元素,否則標號減1
j -= 1
while a[i] <= t and i < j: # 檢測大於基數的元素,否則標號加1
i += 1
if i < j: # 經過檢測之後,如果此時的左右標號滿足條件,就進行數據交換
temp = a[i]
a[i] = a[j]
a[j] = temp
a[left] = a[i] # 完成一次基數的排序,將基數和本次排序得到的中段值交換
a[i] = t
quicksort(left, i-1) # 通過遞歸實現整個排序,總是從每一次新劃分的左邊開始遞歸
quicksort(i+1, right) # 右劃分遞歸
調用該函數,顯示結果:
快排函數的輸入參數修改
'''函數修改說明:
1.基於全局變量來定義函數在使用上不適合交互,所以改寫爲傳入代排序數據
2.其餘操作不變
'''
def quicksort_2(data, left, right):
if left > right:
return
i = left
j = right
t = data[left]
while i != j:
while data[j] >= t and i < j:
j -= 1
while data[i] <= t and i < j:
i += 1
if i < j:
temp = data[i]
data[i] = data[j]
data[j] = temp
data[left] = data[i]
data[i] = t
quicksort_2(data, left, i-1)
quicksort_2(data, i+1, right)
return data
調用函數的結果展示: