if n <= 1:#如果拆分到是乙個元素,那麼返回這個元素即可
return alist
mid = n//2#以mid拆分alist
left_li = merge_sort(alsit[:mid])#遞迴拆分的左半段
right_li = merge_sort(alsit[mid:])#遞迴拆分的右半段
left_pointer,right_pointer =0,0#指向左半段的指標left_pointer(int型別),指向右半段的指標right_pointer(int型別)
result = #合併的結果
while left_pointer快排:
def quick_sort(ary):
return qsort(ary,0,len(ary)-1)
def qsort(ary,left,right):
#快排函式,ary為待排序陣列,left為待排序的左邊界,right為右邊界
if left >= right : return ary
key = ary[left] #取最左邊的為基準數
lp = left #左指標
rp = right #右指標
while lp < rp :
while ary[rp] >= key and lp < rp :#右邊一直向左尋找,找到第乙個不比基準數大的就停止
rp -= 1
while ary[lp] <= key and lp < rp :#左邊一直向右尋找,找到第乙個不比基準數小的就停止
lp += 1
ary[lp],ary[rp] = ary[rp],ary[lp]#將停止後的(即是滿**換的陣列元素進行位置交換)
ary[left],ary[lp] = ary[lp],ary[left]#找到基數字置並且進行交換
qsort(ary,left,lp-1)#基準數左邊(不包括基準數)
qsort(ary,rp+1,right)#基準數右邊(不包括基準數)
return ary
堆排序:
first = int(n/2-1) #最後乙個非葉子節點
for start in range(first,-1,-1) : #構造大根堆
max_heapify(ary,start,n-1)
for end in range(n-1,0,-1): #堆排,將大根堆轉換成有序陣列
ary[end],ary[0] = ary[0],ary[end]
max_heapify(ary,0,end-1)
return ary
#最大堆調整:將堆的末端子節點作調整,使得子節點永遠小於父節點
#start為當前需要調整最大堆的位置,end為調整邊界
def max_heapify(ary,start,end):
root = start
while true :
child = root*2 +1 #調整節點的子節點
if child > end : break
if child+1 <= end and ary[child] < ary[child+1] :
child = child+1 #取較大的子節點
if ary[root] < ary[child] : #較大的子節點成為父節點
ary[root],ary[child] = ary[child],ary[root] #交換
從平均時間來看,快速排序是效率最高的,但快速排序在最壞情況下的時間效能不如堆排序和歸併排序。而後者相比較的結果是,在n較大時歸併排序使用時間較少,但使用輔助空間較多。
上面說的簡單排序包括除希爾排序之外的所有氣泡排序、插入排序、簡單選擇排序。其中直接插入排序最簡單,但序列基本有序或者n較小時,直接插入排序是好的方法,因此常將它和其他的排序方法,如快速排序、歸併排序等結合在一起使用。
基數排序的時間複雜度也可以寫成o(d*n)。因此它最使用於n值很大而關鍵字較小的的序列。若關鍵字也很大,而序列中大多數記錄的最高關鍵字均不同,則亦可先按最高關鍵字不同,將序列分成若干小的子串行,而後進行直接插入排序。
從方法的穩定性來比較,基數排序是穩定的內排方法,所有時間複雜度為o(n^2)的簡單排序也是穩定的。但是快速排序、堆排序、希爾排序等時間效能較好的排序方法都是不穩定的。穩定性需要根據具體需求選擇。
上面的演算法實現大多數是使用線性儲存結構,像插入排序這種演算法用鍊錶實現更好,省去了移動元素的時間。具體的儲存結構在具體的實現版本中也是不同的。
別人的總結
在我30多年的程式設計師生涯裡,我學到了不少有用的東西。下面是我這些年積累的經驗精華。我常常想,如果以前能有人在這些經驗上指點一二,我相信我現在會站得更高。這是我在我的第乙份工作上面學來的。只有當我們給客戶展示產品的時候,他們才會意識到哪些是必須的。給出乙個功能性原型設計遠遠比一張長長的文字 要好。...
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...