排序—時間復雜度為O(n)的三種排序算法


這三種排序算法分別是桶排序、計數排序和基數排序,之所以它們的時間復雜度能到達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個電話號碼進行排序,就可以使用基數排序算法。

 

該篇博客是自己的學習博客,水平有限,如果有哪里理解不對的地方,希望大家可以指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM