排序演算法 基數排序

2021-10-07 21:42:59 字數 2343 閱讀 8267

基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些「桶」中,達到排序的作用。

基數排序法是屬於穩定性的排序,基數排序法的是效率高的穩定性排序法。

將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

示例:將陣列按基數排序,進行公升序排序

第1輪排序[按照個位排序]:

說明: 事先準備10個陣列(10個桶), 0-9 分別對應 位數的 0-9

(1) 將 各個數,按照個位大小 放入到 對應的 各個陣列中

(2) 然後從 0-9 個陣列/桶,依次,按照加入元素的先後順序取出

第1輪排序後:

第2輪排序[按照十位排序]

(1) 將 各個數,按照十位大小 放入到 對應的 各個陣列中

(2) 然後從 0-9 個陣列/桶,依次,按照加入元素的先後順序取出

第2輪排序後:

第3輪排序[按照百位排序]

(1) 將 各個數,按照百位大小 放入到 對應的 各個陣列中

(2) 然後從 0-9 個陣列/桶,依次,按照加入元素的先後順序取出

第3輪排序後:

基數排序是對傳統桶排序的擴充套件,速度很快.

基數排序是經典的空間換時間的方式,占用記憶體很大, 當對海量資料排序時,容易造成 outofmemoryerror 。

基數排序是穩定的。

[注:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的]

public

class

radixsort

;// radixsort(arr);

//測試速度

int[

]arr=

newint

[8000000];

for(

int i =

0; i <

8000000

; i++

)long startmillis = system.

currenttimemillis()

;radixsort

(arr)

;long endmillis = system.

currenttimemillis()

; system.out.

println

("基數排序耗時:"

+(endmillis-startmillis)

+"ms");

}public

static

void

radixsort

(int

arr)

//找到最大的位數

int maxlengh =

(max +"")

.length()

;for

(int i =

0, n =

1; i < maxlengh; i++

, n *=10)

//用於遍歷每個桶,取出資料

int index =0;

for(

int k =

0; k < bucketelementcounts.length; k++)}

//每輪需清空buckelementcounts

bucketelementcounts[k]=0

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

}

時間複雜度為o(dn),

排序演算法 基數排序

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

排序演算法 基數排序

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

排序演算法 基數排序

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