排序算法總結

常見排序算法評估

時間複雜度

O(n2):冒泡排序、選擇排序、插入排序

O(nlogn):歸併排序、快速排序、堆排序、希爾排序

O(n):計數排序、基數排序   不是基於比較的排序算法,思想來於桶排序

空間複雜度

O(1):插入排序、選擇排序、冒泡排序、堆排序(用遞歸實現是O(logn))、希爾排序

O(logn~n):快速排序

O(n):歸併排序

O(m):計數排序,基數排序(m是“桶”的個數)

穩定性

概念:假定待排序的記錄序列中,存在多個具有相同關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,稱這種排序算法是穩定的,否則稱爲不穩定的。

穩定的排序算法:冒泡排序、插入排序、歸併排序、計數排序、基數排序、桶排序

不穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序


常見排序算法及python實現

快速排序

通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

快排代碼實現需要分割(partition)部分與遞歸實現部分。

# 快排
def partition(l, left, right):
    k = left
    val = l[right]
    for i in range(left, right):
        if l[i]<val:
            l[i], l[k] = l[k], l[i]
            k += 1
    l[right], l[k] = l[k], l[right]
    return k

def quicksort(l, left, right):
    if left<right:
        k0 = partition(l, left, right)
        quicksort(l, left, k0-1)
        quicksort(l, k0+1, right)
    return l

L = [4,5,6,0,1,7,2,3]
print(quicksort(L,0,len(L)-1))

歸併排序

假設序列共有n個元素,將序列每相鄰兩個數字進行有序合併(merge),形成(n//2+n%2)個序列,排序後每個序列包含兩個元素將上述序列再次歸併,形成(n//4)個序列,每個序列包含四個元素。重複歸併操作,直到所有元素排序完畢。

歸併排序代碼實現需要有序合併(merge)部分與遞歸實現部分。

# 歸併排序
def merge(a,b):
    c = []
    i = j = 0
    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
    if i==len(a):
        for h in b[j:]:
            c.append(h)
    else:
        for h in a[i:]:
            c.append(h)
    return c

def mergesort(l):
    if len(l)<=1:
        return l
    middle = len(l)//2
    left = mergesort(l[:middle])
    right = mergesort(l[middle:])
    return merge(left,right)

L = [4,5,6,0,1,7,3,3]
print(mergesort(L))

 

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