各種排序的實現與複雜度分析(持續更新),排序持續
穩定性:
選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,
冒泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。
複雜度
冒泡法: 複雜度為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
排序方法 |
最好時間複雜度 |
平均時間複雜度 |
最壞時間複雜度 |
空間複雜度 |
是否穩定 |
冒泡排序 |
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) |
不定 |
取決於桶內 |
(表來源:http://blog.csdn.net/ns_code/article/details/20540069)
演算法實現:
首先是快速排序的實現
void quickSort(int A[], int low, int high){ if(low < high){ int i = low, j = high, key = A[i]; while(i < j){ while(i < j && A[j] > key) // 從右向左找第一個小於key的數 --j; if(i < j) A[i++] = A[j]; while(i < j && A[i] < key) // 從左向右找第一個大於等於key的數 ++i; if(i < j) A[j--] = A[i]; } A[i] = key; //mid quickSort(A,low,i-1); quickSort(A,i+1,high); }}