各種排序演算法

2021-08-28 06:01:22 字數 2113 閱讀 5904

def insertsort(a):

if len(a)==1:

return a

for i in range(1,len(a)):

j=i-1

insert=a[i]

while j>=0 and a[j]>insert:

a[j+1]=a[j]

j=j-1

a[j+1]=insert

return a

插入排序首先認為第乙個元素是排好序的,然後將之後的元素往排好序的元素裡插入,這裡用了乙個while迴圈來替代了swap的交換,可以提高效率。

時間複雜的:

最好情況下陣列已經排好序,每次while迴圈裡只比較一次,所以是

最壞情況下陣列倒序,每次while迴圈裡要比較i次,i從1到n,比較

堆排序首先構造乙個堆,堆分為大頂堆和小頂堆。以大頂堆為例,大頂堆是乙個完全二叉樹,每乙個節點都要大於它的左右孩子節點,所以根節點是最大的。排序的方法就是先構造乙個大頂堆,然後將根與最後乙個節點交換,剩餘的節點再調成為大頂堆,選出最大的根節點再交換,依次選出樹中最大的節點來。時間複雜度是nlogn,雖然看上去是簡單的每次選最大的,但是用樹形結構相當於記錄了每次比較的結果,在演算法中可以看到每次迴圈只比較了樹高次的節點。

def adject_heap(ls,i,size):

lchild=2*i+1

rchild=2*i+2

max=i

if ils[max]:

max=lchild

if rchildls[max]:

max=rchild

if max!=i:

ls[max],ls[i]=ls[i],ls[max]

adject_heap(ls,max,size)

def build_heap(ls,size):

for i in range(0,int(size/2))[::-1]:

adject_heap(ls,i,size)

ls=[49,38,65,97,76,13,27,49]

size=len(ls)

build_heap(ls,size)

for i in range(0,size)[::-1]:

ls[0],ls[i]=ls[i],ls[0]

adject_heap(ls,0,i)

print(ls)

首先構造大頂堆,build_heap。在陣列上沒有顯式的構造樹,而是假設陣列是從前到後排成乙個樹,49是根,38,65是它的子節點,依次往後。所以構造大頂堆的過程就是調整陣列讓它成為乙個大頂堆,也就是adject_heap。注意build_heap裡我們是從size/2開始到0的,這樣做是因為葉節點沒有子節點所以不用調整,而且調整要從下到上。

通過分析陣列下標可以發現,49是根,標號是0,它的左右孩子分別是1和2,也就是lchild=2*i+1,rchild=2*i+2。有的部落格會在最前面加乙個0輔助,這樣是沒有必要的。調整的方法就是先記錄三個下標,max=當前節點,lchild,rchild是左右孩子,比較max的節點和孩子比哪個大,大的話將max賦值給哪個節點的下標。注意要判別child的下標經過build_heap之後現在是乙個大頂堆了,根是陣列中最大的元素,將根與陣列最後乙個元素交換,此時再對除最後乙個元素之外的元素調整成堆,獲得根就是最大值再新增到末尾,依次從大到小排序。

def quick(ls,start,end):

if not ls:

return

i,j=start,end

key=ls[start]

if start=key:

j=j-1

ls[i]=ls[j]

while i快速排序就是選取陣列中的乙個數為key,然後將比key大的數都移到右邊,比key小的數都移到左邊,然後再遞迴用這種方法排序左邊和右邊。這種方法還可以用來求陣列中第k大的數。

快速排序有各種方法,不同在排序的方法上,我這裡使用的是挖坑法。先記錄下key的值,然後右指標往左掃到小於key的數的時候將數賦給之前挖的坑,這裡就變成了新坑,然後左指標向右掃瞄到大於key的數填到坑里又出現新坑,最後剩下的坑填入我們之前儲存的key值。

排序 各種排序演算法

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...

各種排序演算法

交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...