各種排序的實現與複雜度分析(持續更新)

2021-06-28 03:28:05 字數 2108 閱讀 4999

穩定性:

選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,

氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。

複雜度

冒泡法:  複雜度為o(n*n)。當資料為正序,將不會有交換。複雜度為o(0)。不說了。

直接插入排序:o(n*n)

希爾排序:演算法的複雜度為n的1.2次冪

選擇排序:o(n*n)

快速排序:不穩定,平均時間複雜度o(nlogn),最壞情況時間複雜度為o(n2)。所有內部排序方法中最高好的,大多數情況下總是最好的。空間複雜度主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度為log2n,其空間複雜度也就為o(logn),最壞情況,需要進行n‐1遞迴呼叫,其空間複雜度為o(n),平均情況,空間複雜度也為o(logn)

歸併排序:log2(n)*n

堆排序:log2(n)*n

1. 建立最大堆(堆頂的元素大於其兩個兒子,兩個兒子又分別大於它們各自下屬的兩個兒子… 以此類推)

2. 將堆頂的元素和最後乙個元素對調(相當於將堆頂元素(最大值)拿走,然後將堆底的那個元素補上它的空缺),然後讓那最後乙個元素從頂上往下滑到恰當的位置(重新使堆最大化)。

3. 重複第2步。

堆排序是就地排序,輔助空間為o(1).

它是不穩定的排序方法。

排序方法

最好時間複雜度

平均時間複雜度

最壞時間複雜度

空間複雜度

是否穩定

氣泡排序

o(n)

o(n*n)

o(n*n)

o(1)

穩定插入排序

o(n)

o(n*n)

o(n*n)

o(1)

穩定選擇排序

o(n*n)

o(n*n)

o(n*n)

o(1)

不穩定希爾排序

o(n)

不定o(n*n)

o(1)

不穩定堆排序

o(n*logn)

o(n*logn)

o(n*logn)

o(1)

不穩定歸併排序

o(n*logn)

o(n*logn)

o(n*logn)

o(n)

穩定快速排序

o(n*logn)

o(n*logn)

o(n*n)

o(logn)

不穩定計數排序

o(n+k)

o(n+k)

o(n+k)

o(k)

穩定基數排序

o(d(n+k))

o(d(n+k))

o(d(n+k))

o(k)

穩定桶排序

o(n)

o(n)

o(n)

不定取決於桶內

演算法實現:

首先是快速排序的實現

void quicksort(int a, int low, int high)

a[i] = key; //mid

quicksort(a,low,i-1);

quicksort(a,i+1,high);

}}

堆排序

畫圖理解更佳,每次把最大的移到堆頂,然後放回最底輸出,如此迴圈,得到排序

#include using namespace std;  

void maxheap(int a, int no, int last)  

void makeheap(int a, int root, int last)  

void heapsort(int a, int lenght)  

int main();  

heapsort(r, 8);  

for(int i = 0; i < 8; i++)  

cout << r[i] << endl;  

return 0;  

}

各種排序演算法的複雜度

各種排序演算法的複雜度 joyes414 排序法平均時間 最差情形 穩定度額外空間 備註冒泡 o n2 o n2 穩定 o 1 n小時較好 交換o n2 o n2 不穩定 o 1 n小時較好 選擇o n2 o n2 不穩定 o 1 n小時較好 插入o n2 o n2 穩定 o 1 大部分已排序時較好...

各種排序演算法的複雜度

排序法 平均時間 最差情形 穩定度額外空間 備註冒泡 o n2 o n2 穩定 o 1 n小時較好 交換o n2 o n2 不穩定 o 1 n小時較好 選擇o n2 o n2 不穩定 o 1 n小時較好 插入o n2 o n2 穩定 o 1 大部分已排序時較好 基數o logr b o logr b...

各種排序演算法時間複雜度及空間複雜度

平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 最好情況是加了改進方法的最好 即冒泡的過程中檢查是否發生了交換,如果沒有發生交換,說明都排好序了,就break 插入 平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 直接選擇排序 平均o n 2 最壞o ...