常見八大排序演算法

2022-09-07 08:42:10 字數 3796 閱讀 4347

排序演算法

穩定性平均時間複雜度

最差時間複雜度

空間複雜度

備註堆排序

不穩定o(nlogn)

o(nlogn)

o(1)

n大時較好

快速排序

不穩定o(nlogn)

o(n^2)

o(nlogn)

n較大時好

希爾排序

不穩定o(nlogn)

o(n^s)

o(1)

s時所選的分組

選擇排序

不穩定o(n^2)

o(n^2)

o(1)

n較小時較好

基數排序

穩定o(logrb)

o(logrb)

o(n)

b是真數(0--9),r是基數

氣泡排序

穩定o(n^2)

o(n^2)

o(1)

n小時較好

插入排序

穩定o(n^2)

o(n^2)

o(1)

大部分已排序時較好

歸併排序

穩定o(nlogn)

o(nlogn)

o(1)

n大時較好

演算法流程:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。

重複第二步,直到所有元素均排序完畢。

def selectionsort(arr):

for i in range(len(arr)-1):

minindex = i # 記錄最小數的索引

for j in range(i+1,len(arr)):

if arr[j]= j:

return

pivot = arr[i] # 以第乙個元素為基準

堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。

arr[i],arr[largest] = arr[largest],arr[i] # 交換

# 此時largest位置的數字(也就是最開始輸入那個lis[i])處於待定狀態,需要在它所有根部中確定其位置

heapify(arr, n, largest)

def heapsort(arr):

n = len(arr)

# build a maxheap.

for i in range(n, -1, -1):

# 先把堆調整好小根堆的狀態,在全堆中逐個調整每個數字的位置,調整的方法是在它所有根部中確定其位置

heapify(arr, n, i)

# 乙個個交換元素

for i in range(n-1, 0, -1):

arr[i], arr[0] = arr[0], arr[i] # 交換

# 把新上來的0號安排到合適的位置上去,其中i指的是要調整的堆的範圍

heapify(arr, i, 0)

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...

八大排序演算法

一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...

八大排序演算法

排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...