一文讀懂排序算法-python實現

 talk is cheap, show code

def bubble_sort(arr):
    '''
    冒泡排序
    平均時間複雜度:O(n^2)
    最好情況:O(n)
    最壞情況:O(n^2)
    空間複雜度:O(1)
    n次遍歷,每次找出最大放後邊
    '''
    len_arr = len(arr)
    if len_arr < 2:
        return arr

    for i in range(len_arr):
        for j in range(len_arr-1):
            if arr[j] >= arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    print arr


def selection_sort(arr):
    '''
    選擇排序
    平均時間複雜度:O(n^2)
    最好情況:O(n^2)
    最壞情況:O(n^2)
    空間複雜度:O(1)
    n次遍歷,每次遍歷剩餘的數組,從中找出最小的放在前邊
    '''
    len_arr = len(arr)
    if len_arr < 2:
        return arr

    for i in range(len_arr):
        min_ind = i
        for j in range(i+1, len_arr):
            if arr[j] <= arr[min_ind]:
                min_ind = j
        arr[i], arr[min_ind] = arr[min_ind], arr[i]
    print arr


def insert_sort(arr):
    '''
    插入排序
    平均時間複雜度:O(n^2)
    最好情況:O(n)
    最壞情況:O(n^2)
    空間複雜度:O(1)
    n次遍歷,默認前邊的是排好順序的,每次取後邊的插入到前邊合適位置
    '''
    len_arr = len(arr)
    if len_arr < 2:
        return arr

    for i in range(1, len(arr)):
        for j in range(i, 0, -1):
            if arr[j] < arr[j-1]:
                arr[j], arr[j-1] = arr[j-1], arr[j]
            else:
                break
    print arr


def quick_sort(arr):
    '''
    快速排序-遞歸版本
    平均時間複雜度:O(nlogn)
    最好情況:O(nlogn)
    最壞情況:O(n^2)
    空間複雜度:O(logn)
    找一個標誌位,比標誌位大的放右邊,比標誌位小的放左邊,遞歸
    '''
    len_arr = len(arr)
    if len_arr < 2:
        return arr

    mid = arr[len_arr // 2]
    left, right = [], []
    arr.remove(mid)
    for item in arr:
        if item >= mid:
            right.append(item)
        else:
            left.append(item)
    return quick_sort(left) + [mid] + quick_sort(right)


def quick_sort_other(arr):
    '''
    快速排序-非遞歸版本
    平均時間複雜度:O(nlogn)
    最好情況:O(nlogn)
    最壞情況:O(n^2)
    空間複雜度:O(logn)
    找一個標誌位,比標誌位大的放右邊,比標誌位小的放左邊,遞歸
    '''
    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)
    print arr


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]
    arr[start] = pivot
    return start


if __name__ == '__main__':
    # arr = [2, 8, 4, 3, 3, 5, 6]
    # bubble_sort(arr)
    # arr = [2, 8, 4, 3, 3, 5, 6]
    # selection_sort(arr)
    # arr = [2, 8, 4, 3, 3, 5, 6]
    # insert_sort(arr)
    # arr = [2, 8, 4, 3, 3, 5, 6]
    # print quick_sort(arr)
    arr = [5, 8, 4, 3, 3, 5, 6]
    quick_sort_other(arr)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章