排序(二)快速排序

基本思想

首先要找一個數作爲基準數,用於參照比較。所有比基數大的都放在基數的右邊,比基數小的都放在基數的左邊。
1. 先選擇最左端的一項作爲基準數
2. 分別從左端和有段選擇一項作爲哨兵i哨兵j
3. 基準數在左,在右端的哨兵j先動(從右向左,i從坐向右)。
4. 哨兵i關注小於基準數哨兵j關注大於基準數

例子代碼

a = [9, 4, 7, 3, 1, 5, 8, 6, 2]

def quicksort(left, right):
    if left > right:#如果左側哨兵 比右側哨兵大,說明在進入遞歸之前,左側哨兵比右側哨兵大
        return
    tmp = a[left]#獲得最左側元素作爲基準數
    i = left
    j = right
    while i != j :
        #先從右往左找,關注比基準數小的,如果大於基準數,哨兵j左移(-1),找到了a[j]
        while a[j] >= tmp and i < j:
            j = j - 1
        #如果j找到了比基準數小的數,跳出循環。哨兵i繼續找,哨兵i關注比基準數大的,如果小於基準數,哨兵i右移(+1),找到了a[i]
        while a[i] <= tmp and i < j:
            i = i + 1
        #交換兩個數(a[i],a[j])在數組中的位置
        if i < j:#如果哨兵i和哨兵j沒有相遇時
            t = a[i]
            a[i] = a[j]
            a[j] = t
    #將基準數歸位,左側都爲小於基準數的,右側都爲大於基準數的。
    a[left] = a[i]
    a[i] = tmp

    quicksort(left,i - 1)#基準數左側的繼續排序
    quicksort(i + 1, right)#基準數右側的繼續排序
    return

if __name__ == '__main__':
    print("-------------------- quick sort --------------------")
    print(a)
    quicksort(0, len(a) - 1)
    print(a)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章