python算法實踐——快速排序

                         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

調用函數的結果展示:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章