額外的空間複雜度o(n+r)。其中n是原陣列中元素的個數,r是桶數(基數)
public
void
countingradixsort
(int
nums)
int n =0;
//最大樹的位數
while
(max_num!=0)
//2.根據最大數的位數,從個位到最高位進行基數排序
int e =1;
//用於獲取num的每一位
int[
] buf =
newint
[nums.length]
;//暫時存放數字的陣列
for(
int i =
0; i < n; i++
)//將count[k]轉換為在陣列中的索引
for(
int j =
1; j <
10; j++
)//根據count進行排序,暫時存在buf陣列中
//要從陣列的最後一位往前取
//這樣可以保證:當前位相同時,低位較大的數字在陣列的後面
for(
int j = nums.length-
1; j >=
0; j--
)//將buf中的數給nums
system.
arraycopy
(buf,
0,nums,
0,nums.length)
;//e*10
e *=10;
}}
時間複雜度:每個桶中一般使用較為快速的排序演算法,假設平均時間複雜度為o(nlogn):那麼整個桶排序的時間複雜度為o(n)+o(m * (n/m * log(n/m)))
化簡為o(n)+o(nlog(n/m)),即o(n*(log(n/m)+1))。可以看出,隨著 m(桶數)的增大,演算法的效率越高,當m=n時候,時間複雜度接近o(n)
額外的空間複雜度o(n+m)
資料結構之排序
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。穩定的排序 時間複雜度 空間複雜度 氣泡排序 最差和平均是o n2 最好是o n 1 雙向氣泡排序 最...
資料結構之排序
package com.small 注意a 0 是否有意思,書上c語言基本都是將a 0 作為哨兵,那麼0號元素不能用,我這裡全部是flag代替 author small leaf public class sort else for j i 1 j high 1 j a high 1 flag 希爾...
資料結構之排序
常用的幾種排序方法 冒泡 插入 選擇 快排 歸併排序 1 冒泡 以公升序為例,也是有兩種思路,1 num 0 依次與後面比較將最小的放到第一位 2 將最大的放到最後一位。我比較習慣用第一種 1 include include using namespace std int main for int ...