Python3實現快速排序

2020/2/28發表於2020-12-06

考研人資訊庫

此公眾號會發表計算機考研(初複試資訊)、夏令營等資料,方便考研人對資訊的獲取,節約自身查詢資料的時間,回覆408,可獲得資料結構、作業系統、計算機網路、計算機組成原理全科資料

演算法描述

快速排序(quick-sort)與歸併排序(merge-sort)一樣,使用了分治思想。下面是對一個一般的子陣列A[p~r]進行快速排序的分治步驟:

分解:陣列A[p~r]被劃分為兩個子陣列A[p~q]和A[q+1~r],使得 A[q] 大於等於 A[p~q] 中的每個元素,且小於等於 A[q+1~r] 中的每個元素。(需要注意的是, A[p~q] 和 A[q+1~r] 可能為空)

解決:對子陣列 A[p~q] 和 A[q+1~r] 遞迴呼叫本程式。

合併:因為子陣列都是原址排序的,所以不需要合併操作,此時的A陣列已經是排好序的。

ps:所謂原址排序是指:在對組進行排序的過程中,只有常數個元素被儲存到陣列外面。

快速排序的核心思想其實很簡單,即:在陣列中,如果某元素均比自己前面的元素大(或等於),而比自己後面的元素小(或等於),則該元素處於“正確位置”。

下面給出虛擬碼:

image

可以看出,演算法的關鍵是partiton方法的實現。下面給出它的演算法實現:

image

快排思想:(1)隨便取一個數為基準,一般選擇最後一個數或第一個數

                  (2)然後從頭遍歷,將比基準數小的放在左邊,大的放在右邊,放的時候用交換規則換;

                  (3)在左右兩邊重複此步驟,直至不能分解為止。

 

python 3實現

def partition(arr, start, end):
    # 以最後一個作為基準
    x = arr[end]
    i = start - 1  # i用來記錄位置
    for j in range(start, end):
        # 當arr[j]>x時,i會停留,也就是說i+1上的數大於x
        if arr[j] <= x:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i + 1], arr[end] = arr[end], arr[i + 1]
    return i + 1  # 返回劃分陣列的位置


def quickSort(arr, start, end):
    # 直到不能分解為止
    if start < end:
        position = partition(arr, start, end)
        quickSort(arr, start, position - 1)  # 對左邊(小於arr[position])的排序
        quickSort(arr, position + 1, end)  # 對右邊(大於arr[position])的排序

 測試

arr = [9, 2, 4, 0, 4, 1, 3, 5]
quickSort(arr, 0, len(arr) - 1)
print(arr)

測試結果

相關文章