基數排序(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 首先將序列中的記錄按照最低位值的大小分配到各個桶中...