常見排序算法評估
時間複雜度
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))