1. 程式人生 > >[算法基礎]快排、歸並、堆排序比較

[算法基礎]快排、歸並、堆排序比較

切分 lse 有序數組 log quic complete 堆排 歸並 clas

1、快速排序,上代碼:

def quickSort(arr):
    if len(arr) <= 1:
        return arr
    v = arr[0]
    high = [i for i in arr[1:] if i>=v]
    low = [i for i in arr[1:] if i<v]
    return quickSort(low) + [v] + quickSort(high)

分析一哈:

當不考慮最差情況(O(n^2))時,快排時間復雜度為O(nlogn):因為層數為O(logn)即調用棧的高度是O(logn),而每層的時間是O(n)
2、合並排序

采用分而治之的方法,先把數組分成一個個長度為1的數組,再將數組分別按順序組合成一個數組

因此涉及到兩個過程:切分、組合

1.組合過程:兩個有序數組按順序合並為一個數組
def
merge(a, b): i, j = 0, 0 c = [] while i < len(a) and j < len(b): if a[i] <= b[j]: c.append(a[i]) i += 1 else: c.append(b[j]) j += 1 c.extend(a[i:]) c.extend(b[j:])
return c
2.切分過程:只要數組長度大於1就由上而下切割數組,最後自下而上合並
def merge_sort(arr): print(arr) if len(arr) <= 1: return arr mid = len(arr) / 2 # dividing the array up to bottom back = merge_sort(arr[:mid]) fore = merge_sort(arr[mid:]) # merge every 1 length array to the complete return
merge(back, fore)

時間復雜度:最好和最差都是O(nlogn) 空間復雜度:O(logn)

以空間換時間的典型栗子

[算法基礎]快排、歸並、堆排序比較