隨機化快速排序

import random

def randomized_quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = random.choice(arr)
    left = [x for x in arr if x < pivot]
    mid = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return randomized_quicksort(left) + mid + randomized_quicksort(right)

def randomized_quickselect(arr, k):
    """找到第 k 小的元素 (0-indexed)"""
    if len(arr) == 1:
        return arr[0]
    pivot = random.choice(arr)
    left = [x for x in arr if x < pivot]
    mid = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    if k < len(left):
        return randomized_quickselect(left, k)
    elif k < len(left) + len(mid):
        return pivot
    else:
        return randomized_quickselect(right, k - len(left) - len(mid))

# 比較:固定 pivot vs 隨機 pivot
import time
for n in [1000, 10000]:
    arr = list(range(n))
    random.shuffle(arr)
    start = time.time()
    randomized_quicksort(arr[:])
    t1 = time.time() - start
    print(f"n={n}: 隨機 pivot = {t1:.4f}s")

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!