[算法] 快速排序

# 快速排序遞歸玩法
def quicksort(arr):
    # 結束條件
    if len(arr) <= 1:
        return arr
    # 用中間值更穩定
    middle = arr[len(arr) // 2]
    # 記得將middle拿出來,最後再放到中間
    del arr[len(arr) // 2]
    # 利用列表生成式,100W數據,2.9s
    # left = [x for x in arr if x <= middle]
    # right = [x for x in arr if x > middle]

    # 2.6s
    left = []
    right = []
    for x in arr:
        left.append(x) if x <= middle else right.append(x)

    # 記得把middle放中間
    return quicksort(left) + [middle] + quicksort(right)


# 非遞歸玩法
def quicksort2(arr):
    '''
    模擬棧操做實現非遞歸的快速排序
    '''
    if len(arr) < 2:
        return arr
    stack = []
    stack.append(len(arr) - 1)
    stack.append(0)
    while stack:
        l = stack.pop()
        r = stack.pop()
        index = partition(arr, l, r)
        if l < index - 1:
            stack.append(index - 1)
            stack.append(l)
        if r > index + 1:
            stack.append(r)
            stack.append(index + 1)


def partition(arr, start, end):
    # 分區操做,返回基準線下標
    pivot = arr[start]
    while start < end:
        while start < end and arr[end] >= pivot:
            end -= 1
        arr[start] = arr[end]
        while start < end and arr[start] <= pivot:
            start += 1
        arr[end] = arr[start]
    # 此時start = end
    arr[start] = pivot
    return start


if __name__ == '__main__':
    li = list(range(1000000))
    import random

    random.shuffle(li)
    sorted = quicksort(li)
    print(sorted[:10])

 

快速排序。app

相關文章
相關標籤/搜索