基數排序演算法的實現與原理詳解

2021-10-11 09:35:49 字數 4341 閱讀 5339

有 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...