排序演算法 7 基數排序

2021-10-23 11:41:41 字數 2221 閱讀 6276

二、**實現

三、效能對比

四、 基數排序是穩定的

基數排序是高效穩定排序,它通過鍵值的各個位的值,將要排序的元素分配到某些桶中以達到排序的目的,也叫桶子法,是桶排序的擴充套件。

以這一組數為例:

/**

* * 實現思路:

* 建立10個桶,下標分別是0~9,每個桶中用於存放陣列,將整數按位數切割成不同的數字,再分別按各個位上的數字,將數放到對應下標的桶中。

* 比如一組數中,最大的數是三位數,則:

* 1)將所有數先按個位上的數大小,將這些數放到對應下標的桶(陣列)中;

* 2)將所有數先按十位上的數大小(不足兩位的,十位補零),將這些數放到對應下標的桶(陣列)中;

* 3)將所有數先按百位上的數大小(不足三位的,百位、十位補零),將這些數放到對應下標的桶(陣列)中;

* 最大的數是幾位數,就進行幾輪分派,直到最後一輪結束,所有數字按已經是有序的了。

*/public

class

radixsort

;int

arr =

newint

[80000000];

for(

int i=

0;i) ******dateformat format =

new******dateformat

("yyyy-mm-dd hh:mm:ss:sss");

system.out.

println

("排序前:"

+ format.

format

(new

date()

));radixsort

(arr)

; system.out.

println

("排序後:"

+format.

format

(new

date()

));// system.out.println(arrays.tostring(arr));

}public

static

void

radixsort

(int

arr)

}int maxlength =

(maxval+"")

.length()

;//三、開始對陣列中的數進行分派

記錄每個桶中存了幾個數

int[

] bucketelementcounts =

newint[10

];for(

int j =

0,n=

1; j

, n*=10)

一輪結束後,將各個桶中的數取出存到原陣列中,取出時根據bucketelementcounts陣列可知道每個桶中可以取幾個數

int index =0;

for(

int p =

0; p<

10; p++)}

//從當前桶中獲取數完之後,最後將該桶中儲存元素的個數設定成0

bucketelementcounts[p]=0

;}}}

}

以80000個資料測試,耗時大約12ms

800000個資料耗時大約220ms

但是當資料量再大一些的時候,比如80000000個資料,就會報outofmemoryerror,由於基數排序是採用空間換時間,因此當資料比較大的時候,需要的記憶體空間會特別大,容易產生空間不足的問題

以80000000個數為例,需要10個桶(陣列),每個桶的大小都是80000000,還需要乙個長度為10的陣列來臨時儲存每個桶中存了幾個數,每個int佔4個位元組

80000000114/1024/1024/1024約等於 3g,一次計算需要3g的記憶體空間。

因此在資料量不是很大的時候,基數排序非常快,但是在對海量資料進行排序時,容易造成outofmemoryerror。

當對一組數進行排序時,即使這組數中有若干個大小相同的值,但是它們在排序後的相對為止依然保持不變,如: ,排序後變成 ,此時的3個2的相對順序依然不變,願陣列中的第乙個2,在排序後依然排在所有2的第乙個位置。這一特性可以被用在將物件多維排序中,比如一組按照日期排序後,再按照大小排序,此時,兩張同樣大小的**,他們的相對次序依然是按照日期有序排列的。

排序演算法 基數排序

基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...

排序演算法 基數排序

一 基數排序的思想 不直接比較數與數的大小。把待排序的整數按位分,分為個位,十位 從小到大依次將位數進行排序。實際上分為兩個過程 分配和收集。分配就是 從個位開始,按位數從小到大把資料排好,分別放進0 9這10個桶中 收集就是 依次將0 9桶中的資料放進陣列中 重複這兩個過程直到最高位 二 過程 比...

排序演算法 基數排序

基數排序稱桶排序。它按照記錄的各位值逐步進行排序。適用於整數型別的排序。基數排序不同於別的排序方法通過比較和交換來排序,它是通過按照桶來分配和收集的方法實現的。基本思想 假設待排序的記錄都是m位d進製 不足m位的高位補0 設定d個桶 0,1,d 1 首先將序列中的記錄按照最低位值的大小分配到各個桶中...