不穩定:
選擇排序(selection sort)— o(n2)
快速排序(quicksort)— o(nlogn) 平均時間, o(n2) 最壞情況; 對於大的、亂序串列一般認為是最快的已知排序
堆排序 (heapsort)— o(nlogn)
希爾排序 (shell sort)— o(nlogn)
基數排序(radix sort)— o(n·k); 需要 o(n) 額外儲存空間 (k為特徵個數)
穩定:
插入排序(insertion sort)— o(n2)
氣泡排序(bubble sort) — o(n2)
歸併排序 (merge sort)— o(n log n); 需要 o(n) 額外儲存空間
二叉樹排序(binary tree sort) — o(nlogn); 需要 o(n) 額外儲存空間
計數排序 (counting sort) — o(n+k); 需要 o(n+k) 額外儲存空間,k為序列中max-min+1
桶排序 (bucket sort)— o(n); 需要 o(k) 額外儲存空間
1. 氣泡排序
def bublle_sort(l):
if l==:
return l
length=len(l)
for i in range(length):
for j in range(0,length-i-1):
if l[j]>l[j+1]:
l[j],l[j+1]=l[j+1],l[j]
return l
2. 選擇排序
def select_sort(l):
if l==:
return l
length=len(l)
for i in range(length-1):
k=itemp=l[i]
for j in range(i+1,length):
if temp>l[j]:
temp=l[j]
k=jl[i],l[k]=l[k],l[i]
return l
3.插入排序
def insert_sort(l):
if l==:
return l
length=len(l)
for i in range(1,length):
temp=l[i]
k=iwhile k-1>=0 and temp4.歸併排序
def merge(l1,l2):
l=while l1!= and l2!=:
if l1[0]5.快速排序
def partion(l,i,j):
temp=l[i]
while i=temp: ####### 注意從右邊開始容易一些
j-=1
if i=j:
return l
mid=partion(l,i,j)
quick_sort(l,i,mid-1)
quick_sort(l,mid+1,j)
return l
6. 堆排序
def heap(l):
if l==:
return l
length=len(l)
start=length//2
while start>=0:
k=start
while 2*k+1<=length-1: ######### 先比較孩子節點比較好
temp=2*k+1
if 2*k+2<=length-1 and l[2*k+2]>l[2*k+1]:
temp=2*k+2
if l[k]l[k],l[temp]=l[temp],l[k]
k=temp
else:
break
start-=1
return l
def heap_sort(l):
out=
while l!=:
heap(l)
out.insert(0,l[0])
l[0]=l[-1]
l.pop(-1)
return out
常用演算法排序比較
先看圖 2.三種簡單排序演算法簡單,但是效率低下 高階排序在簡單排序基礎上優化,演算法複雜,換取的是效能提高,同時可能需要更多的輔助空間。3.快速排序和歸併排序都使用了分治和遞迴,所以面試時被問到的機會比較高,尤其是快速排序。4.從時間效能上看,快速排序是所有排序演算法中實際效能最好的,然而快速排序...
DS 常用排序演算法比較
1.穩定性比較 插入排序 氣泡排序 二叉樹排序 二路歸併排序及其他線形排序是穩定的 選擇排序 希爾排序 快速排序 堆排序是不穩定的 2.時間複雜性比較 插入排序 氣泡排序 選擇排序的時間複雜性為o n2 其它非線形排序的時間複雜性為o nlog2n 線形排序的時間複雜性為o n 3.輔助空間的比較 ...
常用排序演算法總結(2) 非比較排序演算法
主要有氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。在一定條件下,它們的時間複雜度可以達到o n 需要三個陣列 待排序陣列 int arr new int 輔助計數陣列 int help new int max min 1 該陣列大小為待排序陣列中的最大值減最小值 1 輸出陣列 int...