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
posted @ 2021-07-29 18:08  水天需  阅读(44)  评论(0编辑  收藏  举报