Java實現基數排序

2021-09-20 13:17:34 字數 2205 閱讀 5660

基數排序不同於之前所介紹的各類排序,前邊介紹到的排序方法或多或少的是通過使用比較和移動記錄(元素)來實現排序,而基數排序的實現不需要進行對關鍵字的比較,只需要對關鍵字進行「分配」與「收集」兩種操作即可完成。

例如對無序表

進行基數排序,由於每個關鍵字都是整數數值,且其中的最大值個位十位百位構成,每個數字上的數字從

09,首先將各個關鍵字按照其個位數字的不同進行分配分配表如下圖所示:

通過按照各關鍵字的個位數進行分配,將分配到每一行的資料按放入時的順序取出後得到的序列為:。在該序列表的基礎上,再按照各關鍵字的十位數字對各關鍵字進行分配,得到的分配表如下圖所示:

由上表順序收集得到的記錄表為:。在該無序表的基礎上,依次將表中的記錄按照其關鍵字的百位數字進行分配,得到的分配如下圖所示:

最終通過三次分配與收集,最終得到的就是乙個排好序的有序表:

例子中是按照個位-十位-百位的順序進行基數排序,此種方式是從最低位開始排序,所以被稱為最低位優先法(簡稱「lsd法」)。

同樣還可以按照百位-十位-各位的順序進行排序,稱為最高位優先法(簡稱「msd法」),使用該方式進行排序同最低位優先法不同的是:當無序表中的關鍵字進行分配後,相當於進入了多個子串行,後序的排序工作分別在各個子串行中進行(最低位優先法每次分配與收集都是相對於整個序列表而言的)。

例如還是對使用最高位優先法進行排序,首先按照百位的不同進行分配,得到的分配表為:

由上圖所示,整個無序表被分為了 3 個子序列,序列 1 和序列 2 中含有多個關鍵字,序列 3

中只包含了乙個關鍵字,最高位優先法完成排序的標準為:直到每個子串行中只有乙個關鍵字為止,所以需要分別對兩個子串行進行再分配,各自的分配表如下圖所示:

上表中,序列 1 中還有含有兩個關鍵字的子串行,所以還需要根據個位進行分配,最終按照各子串行的順序同樣會得到乙個有序表。

具體的實現**為:

如果**看不明白可以先看看這裡:基於基數排序實現的桶排序

public class radixsort ;// 待排序陣列

sort(data, 3);

print(data);

}/**

* 從小到大排序

* @param data 待排序陣列

* @param d 表示最大的數有多少位

*/public static void sort(int data, int d)

int pos = 0;

for (int j = 0; j < 10; j++)

index[j] = 0;

}n *= 10;

}}public static void print(int array)

system.out.println();

}}

基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog®m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

Java實現基數排序

在眾多的排序方法中基數排序比較特殊,它是一種不需要進行關鍵字之間比較的排序方法,利用多關鍵字的劃分,逐漸將待排序列排好序。舉個例子 現在有陣列 278,109,63,930,589,184,505,269,8,83 第一次根據各位數將陣列劃分為10個佇列 當然其中的某些佇列可能不含有元素 0 930...

基數排序(java實現)

將所有待比較數值 正整數 統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。參考文章 點我 時間複雜度 基數排序中r為基數,d為位數。時間複雜度為o d n r 空間複雜度 對於任何位數上的基數進行 裝...

基數排序法(Java實現)

class demo 呼叫基數排序函式 lsd radixsort arr,3 輸出排序後的陣列 for int i 0 i arr是要排序的陣列,max是陣列中最大的數有幾位 public static void lsd radixsort int arr,int max 分別統計第k位是0,1,...