排序演算法別人總結

2021-10-18 13:05:32 字數 2685 閱讀 7604

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...