這三種排序演算法分別是桶排序、計數排序和基數排序,之所以它們的時間複雜度能到達o(n),是因為它們都是非基於比較的排序演算法,不涉及元素之間的比較操作。
1 桶排序
1.1 原理
將待排資料元素分配到幾個有序的桶中,然後對每個桶中的資料元素分別進行排序,每個桶中的資料元素有序後按桶的順序將資料元素依次取出,這樣整個序列就有序。
1.2 演算法分析
1.2.1 時間複雜度
假設待排序列資料元素個數為n,桶的數量為m;那麼平均每個桶中的資料元素個數為k = n / m,對每個桶中的資料元素進行快速排序,那麼每個桶中的時間複雜度為o(k * logk),也就是(n / m) * o(log (n / m)),總的時間複雜度為o(n * log(n / m));當桶的個數m接近資料元素個數時,那麼log(n / m)就是乙個常數,此時時間複雜度為o(n)。
1.2.2 空間複雜度
實現過程中,所有桶大小之和等於待排序列資料元素個數;對桶內資料元素進行排序時,可以使用快速排序和歸併排序,快速排序的時間複雜度為o(1),歸併排序的時間複雜度為o(n);所以桶排序的時間複雜度為o(n)。
1.2.3 穩定性
桶排序的穩定性與桶內元素排序演算法是否穩定有關,如果桶內排序演算法是穩定的,那麼桶排序也是穩定的,反之,則桶排序不是穩定的。
1.2.4 適用場景
1)待排資料元素在一定區間內分布均勻,可以容易的劃分到桶中,而且各個桶中的資料元素個數均勻;
2)桶排序比較適用於外部排序,外部排序就是當資料量過大,無法全部載入到記憶體中。
2 計數排序
2.1 原理
計數排序可以看成是特殊的桶排序。待排序序列有n個資料元素且數值範圍不大,最大值為k,我們可以劃分為k個桶,每個桶內的資料元素值相同,節省了桶內排序的時間。
2.2 演算法分析
2.2.1 時間複雜度
計數排序的實現過程中,需要遍歷兩次序列,第一次從前往後劃分資料元素,第二次從後往前重新排序,所以計數排序的時間複雜度為o(n)。
2.2.2 空間複雜度
計數排序過程中,首先需要長度為k+1的陣列儲存每個數值的元素個數,然後重新排序過程中,需要臨時陣列存放排序結果,所以計數排序的空間複雜度為o(n)。
2.2.3 穩定性
計數排序的實現過程中只有將原序列中資料元素存放到臨時陣列時會發生位置改變,但是實現使得並不會改變相同元素的相對位置,所以計數排序是穩定的。
2.3 適用場景
1)計數排序適合資料範圍不大的場景;
2)計數排序只適合於非負整數排序,如果是其他資料型別,要在不改變其相對大小的情況下,將其轉換為非負整數再進行排序。
3 基數排序
將資料元素劃分出獨立的位進行比較,而且位之間有遞進關係,如果a的高位比b大,那麼低位就不用進行比較了。除此之外,每乙個位的資料範圍不能太大,要可以用桶排序或者計數排序進行排序,這樣基數排序的時間複雜度才為o(n)。例如,我們對10個**號碼進行排序,就可以使用基數排序演算法。
該篇部落格是自己的學習部落格,水平有限,如果有**理解不對的地方,希望大家可以指正!
堆排序時間複雜度 堆排序
科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...
三種時間複雜度為O(n 2)的排序演算法
1.氣泡排序 基本思想 依次比較相鄰元素,若前面的大於後面的就交換元素,在一次迭代中將最大的元素 沉降 到最後的位置,經過n 1次迭代即可完成排序目的。public static void bubblesort int data if bfinished 上述 是優化後的氣泡排序,我們知道在一次迭代...
快速排序時間複雜度分析
為了分析快速排序的時間複雜度,請先看下面的主定理 主定理 t n at n b f n 其中 a 1 and b 1 是常量 並且 f n 是乙個漸近正函式,為了使用這個主定理,您需要考慮下列三種情況 快速排序的每一次劃分把乙個 問題分解成兩個子問題,其中的關係可以用下式表示 t n 2t n 2 ...