1. 程式人生 > 其它 >python實現快速排序(演算法4)

python實現快速排序(演算法4)

  1. 時間複雜度:
    • 最好:nlog n
    • 最壞:n*n
    • 平均:nlog n
  2. 空間複雜度:log n
  3. 穩定性:不穩定

遞迴實現

def quick_sort(arr, first, last):
    if first >= last:
        return
    pivot = partition2(arr, first, last)
    quick_sort(arr, first, pivot - 1)
    quick_sort(arr, pivot + 1, last)

# 經典,好理解
def partition2(arr, lo, hi):
    i , j, pivot = lo+1, hi, arr[lo] # left and right scan indices, partition item
    while True:
        # scan right, scan left, check for scan complete, and exchange
        while arr[i] < pivot:
            i += 1
            if i == hi:
                break
        while arr[j] > pivot:
            j -= 1
            if j == hi:
                break
        if i >=j:
            break
        arr[i], arr[j] = arr[j], arr[i]
    arr[lo], arr[j] = arr[j], arr[lo] # exchange, put pivot to right place
    return j

3way遞迴實現

def quick3way(arr, lo, hi):
    if hi <= lo:
        return
    lt, i, gt, pivot = lo, lo+1, hi, arr[lo]
    while i <= gt:
        if arr[i] < pivot:
            arr[lt], arr[i] = arr[i], arr[lt]
            lt += 1
            i += 1
        elif arr[i] > pivot:
            arr[i],arr[gt] = arr[gt], arr[i]
            gt -= 1
        else:
            i += 1
    quick3way(arr, lo, lt -1)
    quick3way(arr, lt+1, hi)

    return arr

迴圈實現

def quick_sort_no_recursion(arr, first, last):
    if first >= last:
        return arr
    stack = [first, last]
    while stack:
        first, last = stack.pop(0), stack.pop(0)  # 移除列表中的第一個元素
        if first >= last:
            continue
        i, pivot = first - 1, arr[last] # 最後一個元素為基準值
        for j in range(first, last + 1):
            if arr[j] <= pivot: # 從頭向後找第一個大於基準的數
                i += 1 # 沒找到則i+1, 都是比基準小的數
                arr[i], arr[j] = arr[j], arr[i] # 交換這兩數, 利用了python特性,arr[-1]即是陣列最後一個元素
        stack.extend([first, i - 1, i + 1, last]) # 在列表後追加
    return arr