快速排序 & 快速選擇算法 Python實(shí)現(xiàn)

1.快速排序的基本思想——分治

q:無(wú)序數(shù)組
l:左端點(diǎn)
r:右端點(diǎn)
(1)確定分界點(diǎn)x
常用取法可為q[ l ],q[ (l + r) / 2 ],q[ r ], 隨機(jī)取等
(2)調(diào)整區(qū)間
使區(qū)間左邊的數(shù)均小于等于x,區(qū)間右邊的數(shù)均大于等于x
(3)遞歸處理左右兩段區(qū)間

2.暴力解法

(1)開辟兩個(gè)新空間
a[ ],b[ ]
(2)遍歷q[ l - r ]
q[ i ] <= x 存儲(chǔ)到a[ ]
q[ i ] >= x 存儲(chǔ)到b[ ]
(3)將ab兩個(gè)數(shù)組合并為新數(shù)組
a[ ] → q[ ]
b[ ] → q[ ]

3.優(yōu)美解法

(1)當(dāng)i指向的數(shù)比x小時(shí),i向右移,直到找到一個(gè)比x大的數(shù)
(2)當(dāng)j指向的數(shù)比x大時(shí),j向左移,直到找到一個(gè)比x小的數(shù)
(3)交換i、j位置的數(shù),兩個(gè)指針往前移動(dòng)一位
(4)直至i、j相遇

4.快速排序Python代碼實(shí)現(xiàn)

輸入樣例:

5
3 1 2 4 5

輸出樣例:

1 2 3 4 5

Python3:

def quick_sort(nums, l, r):
    if r <= l:
        return
    x = nums[(l + r) // 2]
    i, j = l - 1, r + 1
    while i < j:
        i += 1
        while nums[i] < x:  # 這里用小于號(hào)
            i += 1
        j -= 1
        while nums[j] > x: # 這里用大于號(hào)
            j -= 1
        if i < j:
            nums[i], nums[j] = nums[j], nums[i]
    quick_sort(nums, l, j) # 這里用 j 和 j + 1
    quick_sort(nums, j + 1, r)

n = input()
nums = [int(v) for v in input().split()]
quick_sort(nums, 0, len(nums) - 1)
for n in nums:
    print(n, end= " ")

5.快速選擇算法(第k個(gè)數(shù))

時(shí)間復(fù)雜度為 O(n)

基本思路:
SL:左邊的數(shù)的個(gè)數(shù)
若 k <= SL,遞歸Left
若 k > SL,遞歸Right,注意此時(shí)找Right第 k - SL 小的數(shù)

6.快速選擇算法Python代碼實(shí)現(xiàn)

給定一個(gè)長(zhǎng)度為n的整數(shù)數(shù)列,以及一個(gè)整數(shù)k,請(qǐng)用快速選擇算法求出數(shù)列從小到大排序后的第k個(gè)數(shù)

輸入樣例:

5 3
3 1 2 4 5

輸出樣例:

3

Python3:

def quick_sort(nums, l, r, k): # 和快排相比,多用一個(gè)參數(shù)k
    if r <= l:
        return
    x = nums[(l + r) // 2]
    i, j = l - 1, r + 1
    while i < j:
        i += 1
        while nums[i] < x:  # 這里用小于號(hào)
            i += 1
        j -= 1
        while nums[j] > x: # 這里用大于號(hào)
            j -= 1
        if i < j:
            nums[i], nums[j] = nums[j], nums[i]
    sl = j - l + 1 # 左側(cè)數(shù)的個(gè)數(shù)
    if k <= sl: quick_sort(nums, l, j, k) # 這里用j
    else: quick_sort(nums, j + 1, r, k - sl) # 這里記得將新的k,替換為k-sl

a = input().split()
n = int(a[0])
k = int(a[1])
nums = [int(v) for v in input().split()]
quick_sort(nums, 0, len(nums) - 1, k)
print(nums[k-1])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容