穩定性:
選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,
氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。
複雜度
冒泡法: 複雜度為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 ...