基數排序 桶排序和計數排序的區別

2021-08-22 12:15:08 字數 1730 閱讀 5174

基本思路是:

將待排序元素劃分到不同的痛。先掃瞄一遍序列求出最大值 maxv 和最小值 minv ,設桶的個數為 k ,則把區間 [minv, maxv] 均勻劃分成 k 個區間,每個區間就是乙個桶。將序列中的元素分配到各自的桶。

對每個桶內的元素進行排序。可以選擇任意一種排序演算法。

將各個桶中的元素合併成乙個大的有序序列。

假設資料是均勻分布的,則每個桶的元素平均個數為 n/k 。假設選擇用快速排序對每個桶內的元素進行排序,那麼每次排序的時間複雜度為 o(n/klog(n/k)) 。總的時間複雜度為 o(n)+o(k)o(n/klog(n/k)) = o(n+nlog(n/k)) = o(n+nlogn-nlogk 。當 k 接近於 n 時,桶排序的時間複雜度就可以金斯認為是 o(n) 的。即桶越多,時間效率就越高,而桶越多,空間就越大。

是一種o(n)的排序演算法,其思路是開乙個長度為 maxvalue-minvalue+1 的陣列,然後

分配。掃瞄一遍原始陣列,以當前值- minvalue 作為下標,將該下標的計數器增1。

收集。掃瞄一遍計數器陣列,按順序把值收集起來。

舉個例子, nums=[2, 1, 3, 1, 5] , 首先掃瞄一遍獲取最小值和最大值, maxvalue=5 , minvalue=1 ,於是開乙個長度為5的計數器陣列 counter ,

1. 分配。統計每個元素出現的頻率,得到 counter=[2, 1, 1, 0, 1] ,例如 counter[0] 表示值 0+minvalue=1 出現了2次。

2. 收集。 counter[0]=2 表示 1 出現了兩次,那就向原始陣列寫入兩個1, counter[1]=1 表示 2 出現了1次,那就向原始陣列寫入乙個2,依次類推,最終原始陣列變為 [1,1,2,3,5] ,排序好了。

計數排序本質上是一種特殊的桶排序,當桶的個數最大的時候,就是計數排序。

是一種非比較排序演算法,時間複雜度是 o(n) 。它的主要思路是,

1. 將所有待排序整數(注意,必須是非負整數)統一為位數相同的整數,位數較少的前面補零。一般用10進製,也可以用16進製制甚至2進製。所以前提是能夠找到最大值,得到最長的位數,設 k 進製下最長為位數為 d 。

2. 從最低位開始,依次進行一次穩定排序。這樣從最低位一直到最高位排序完成以後,整個序列就變成了乙個有序序列。

舉個例子,有乙個整數序列,0, 123, 45, 386, 106,下面是排序過程:

第一次排序,個位,000 123 045 386 106,無任何變化

第二次排序,十位,000 106 123 045 386

第三次排序,百位,000 045 106 123 386

最終結果,0, 45, 106, 123, 386, 排序完成。

當使用2進製時, k=2 最小,位數 d 最大,時間複雜度 o(nd) 會變大,空間複雜度 o(n+k) 會變小。當用最大值作為基數時, k=maxv 最大, d=1 最小,此時時間複雜度 o(nd) 變小,但是空間複雜度 o(n+k) 會急劇增大,此時基數排序退化成了計數排序。

其中, d 表示位數, k 在基數排序中表示 k 進製,在桶排序中表示桶的個數, maxv 和 minv 表示元

素最大值和最小值。

桶排序,基數排序,計數排序的區別

桶排序是在陣列元素在某個小範圍內大量資料情況下時間複雜度為o n 的排序。假如資料的範圍為0 1000我們就開乙個1001大小的陣列進行排序,就是假如100出現了就將100的桶b 100 以十進位制為例,基數指的是數的位,如個位,十位,百位等 基數排序就是多個桶進行桶排序,比如輸入的數最多有兩位,我...

計數排序 桶排序和基數排序

當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如 計數排...

計數排序 桶排序和基數排序

當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如 計數排...