有 10 個桶,對應編號為 0~9
步驟
桶的容量如何確定?
假設陣列每個元素位數相同,那麼單個桶最大容量即為陣列容量,我們用乙個二維陣列來表示桶:
我們如何知道每桶中裝了幾個元素?這也需要記錄,用乙個一維陣列來記錄:("基數排序後 "
+ arrays.
tostring
(arr));
}// 基數排序方法
public
static
void
radixsort
(int
arr)
}//得到最大數是幾位數
int maxlength =
(max +"")
.length()
;//定義乙個二維陣列,表示10個桶, 每個桶就是乙個一維陣列
//說明
//1. 二維陣列包含10個一維陣列
//2. 為了防止在放入數的時候,資料溢位,則每個一維陣列(桶),大小定為arr.length
//3. 名明確,基數排序是使用空間換時間的經典演算法
int[
] bucket =
newint[10
][arr.length]
;//為了記錄每個桶中,實際存放了多少個資料,我們定義乙個一維陣列來記錄各個桶的每次放入的資料個數
//可以這裡理解
//比如:bucketelementcounts[0] , 記錄的就是 bucket[0] 桶的放入資料個數
int[
] bucketelementcounts =
newint[10
];// n=1 表示處理個位,n=10表示處理十位,n=100表示處理百位 ......
for(
int i =
0, n =
1; i < maxlength; i++
, n *=10)
//按照這個桶的順序(一維陣列的下標依次取出資料,放入原來陣列)
int index =0;
//遍歷每一桶,並將桶中的資料,放入到原陣列
for(
int k =
0; k < bucketelementcounts.length; k++
)//第i+1輪處理後,需要將每個 bucketelementcounts[k] = 0 !!!!
bucketelementcounts[k]=0
;}system.out.
println
("第"
+(i+1)
+"輪,對個位的排序處理 arr ="
+ arrays.
tostring
(arr));}}}
程式執行結果
第1輪,對個位的排序處理 arr =
[542,53
,3,14
,214
,748
]第2輪,對個位的排序處理 arr =[3
,14,214
,542
,748,53
]第3輪,對個位的排序處理 arr =[3
,14,53
,214
,542
,748
]基數排序後 [3,
14,53,
214,
542,
748]
public
class
radixsort
system.out.
println
("排序前");
date data1 =
newdate()
; ******dateformat ******dateformat =
new******dateformat
("yyyy-mm-dd hh:mm:ss");
string date1str = ******dateformat.
format
(data1)
; system.out.
println
("排序前的時間是="
+ date1str)
;radixsort
(arr);
date data2 =
newdate()
; string date2str = ******dateformat.
format
(data2)
; system.out.
println
("排序前的時間是="
+ date2str);}
// 基數排序方法
public
static
void
radixsort
(int
arr)
}//得到最大數是幾位數
int maxlength =
(max +"")
.length()
;//定義乙個二維陣列,表示10個桶, 每個桶就是乙個一維陣列
//說明
//1. 二維陣列包含10個一維陣列
//2. 為了防止在放入數的時候,資料溢位,則每個一維陣列(桶),大小定為arr.length
//3. 名明確,基數排序是使用空間換時間的經典演算法
int[
] bucket =
newint[10
][arr.length]
;//為了記錄每個桶中,實際存放了多少個資料,我們定義乙個一維陣列來記錄各個桶的每次放入的資料個數
//可以這裡理解
//比如:bucketelementcounts[0] , 記錄的就是 bucket[0] 桶的放入資料個數
int[
] bucketelementcounts =
newint[10
];// n=1 表示處理個位,n=10表示處理十位,n=100表示處理百位 ......
for(
int i =
0, n =
1; i < maxlength; i++
, n *=10)
//按照這個桶的順序(一維陣列的下標依次取出資料,放入原來陣列)
int index =0;
//遍歷每一桶,並將桶中的資料,放入到原陣列
for(
int k =
0; k < bucketelementcounts.length; k++
)//第i+1輪處理後,需要將每個 bucketelementcounts[k] = 0 !!!!
bucketelementcounts[k]=0
;}system.out.
println
("第"
+(i+1)
+"輪,對個位的排序處理 arr ="
+ arrays.
tostring
(arr));}}}
程式執行結果:
排序前
排序前的時間是=
2020-12
-514:46:42
排序前的時間是=
2020-12
-514:46:43
這個演算法很強,八百萬的資料,不到一秒排好了,好評!有負數的陣列, 我們不用基數排序來進行排序, 如果要支援負數,: 參考
附手寫演算法草稿排序演算法 基數排序詳解
筆者今天學習字尾陣列,發現需要用到基數排序,所以趕緊學習一波。基數排序是基於關鍵字排序,先比較第乙個關鍵字,再比較第二個關鍵字。舉個栗子 假如我們有一堆數,17,8,25,78,123,512,250 實際操作時,是將依次將個位 十位 百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素...
演算法 基數排序的實現
基數排序是對桶排序的乙個擴充套件,是乙個典型的以空間換時間的演算法,其演算法的實現附帶著額外的空間開銷 核心演算法如下 圖上收集個位那裡19應該放到下標為9的桶,有誤 我們需要借助10個桶來完成排序 可以用二維陣列,也可以用鍊錶陣列來實現 以圖上待排序的陣列為例來說明這個演算法的實現過程 初始化10...
基數排序的原理
int maxbit int data,int n 輔助函式,求資料的最大位數 int d 1 int p 10 while maxdata p return d int d 1 儲存最大的位數 int p 10 for int i 0 i n i return d void radixsort i...