1、基數排序(桶排序)介紹
(1)基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些「桶」中,達到排序的作用
(2)基數排序法是屬於穩定性的排序,基數排序法的是效率高的穩定性排序法
(3)基數排序(radix sort)是桶排序的擴充套件
(4)基數排序是2023年赫爾曼·何樂禮發明的。它是這樣實現的:將整數按位數切割成不同的數字,然後按每個位數分別比較。
2、基數排序基本思想
(1)將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。
(2)將陣列 使用基數排序, 進行公升序排序。
第1輪排序 [按照個位排序]: 說明:事先準備10個陣列(10個桶),0-9 分別對應位數的 0-9
(a) 將各個數,按照個位大小放入到對應的各個陣列中
(b) 然後從 0-9 個陣列/桶,依次按照加入元素的先後順序取出
第1輪排序後:542、53、3、14、214、748
第2輪排序 [按照十位排序]
(1) 將各個數,按照十位大小放入到對應的各個陣列中
(2) 然後從 0-9 個陣列/桶,依次按照加入元素的先後順序取出
第2輪排序後: 3、14、214、542、748、53
第3輪排序 [按照百位排序]
(1) 將各個數,按照百位大小放入到對應的各個陣列中
(2) 然後從 0-9 個陣列/桶,依次按照加入元素的先後順序取出
第3輪排序後:3、14、53、214、542、748
排序完成。這裡可以明顯看出排序次數和最大數的位數有關。
3、**實現
第一輪
//定義二維陣列,表示10個桶,每個桶就是乙個一維陣列
//1、二維陣列包含10個一位陣列,
//2、防止在放數溢位,把每個一維陣列的大小(桶的大小)設定arr.length
//3、基數排序是用空間換時間的經典演算法
int bucket = new int [10][arr.length];
//為了記錄每個桶中實際存放了多少數量,定義乙個一位陣列來記錄各個桶每次放入的資料個數
//可以理解:bucketelementcounts[0]記錄的就是bucket[0]桶的放入資料的個數
int bucketelementcounts =new int[10];
//第一輪排序(針對每個元素的個位進行排序)
for(int j=0;j(1)這裡難理解是二維陣列bucket的意義。例如bucket[3][4]就表示的是原陣列中個位數是3的數共有4個。
//取出每個元素的個位
int digitofelement = arr[j] % 10;
//放入到對應的桶中
//二維陣列bucket的digitofelement變數就對應桶號
//二維陣列bucket的bucketelementcounts[digitofelement]就代表digitofelement桶存放的資料的個數
bucket[digitofelement][bucketelementcounts[digitofelement]] = arr[j];
bucketelementcounts[digitofelement]++;
(2)對於這三行**,先拿到元素的個位數,然後將原資料放到其個位數對應的二維陣列中,bucketelementcounts[digitofelement]對應的是個位數為digitofelement的數量。(3)這裡有乙個處理,就是將計數置為0,(bucketelementcounts[k] = 0;)這個為了在第二輪處理十位數的時候,從0開始計數。
第二輪
for(int j=0;j第三輪for(int j=0;j總結規律:遍歷的次數就是最大值的位數
總的**
public static void radixsort(int arr)
} //得到最大數的位數
int maxlen =(max+"").length();
int bucket = new int [10][arr.length];
int bucketelementcounts =new int[10];
// 使用迴圈將**處理
for (int i = 0,n=1; i < maxlen; 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)+"輪排序之後,對個位的處理:");
// for (int k = 0; k < arr.length; k++)
// system.out.println();
}
}
4、時間測試
public static void timetest()
// 寫乙個測試時間
5、基數排序說明
(1)基數排序是對傳統桶排序的擴充套件,速度很快;
(2)基數排序是經典的空間換時間的方式,占用記憶體很大, 當對海量資料排序時,容易造成 outofmemoryerror;
(3)基數排序時穩定的。[注:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的] ;
(4)有負數的陣列,我們不用基數排序來進行排序, 如果要支援負數,參考:
排序 基數排序
基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...
桶排序 基數排序 計數基數排序 Java
前面已經講述了很多排序演算法,但是他們的排序演算法都是基於兩個值之間的比較,通過決策樹的方法可以證明深度為d的二叉樹則最多有 一些好的排序演算法是可以達到時間複雜度是線性的,桶排序就是其中一種。比如有n個數,但是這些數的最大數不超過m。這個時候就可以定義乙個含有m個元素的陣列 初始值為0 然後遍歷n...
計數排序 基數排序
一.計數排序 counting sort 基本思想 對每乙個輸入元素x,確定出小於x的元素個數。適用範圍 適用於輸入是由小範圍的整數構成的序列。穩定性 演算法是穩定的。具體實現 include using namespace std arr 初始輸入陣列,res 存放排序結果的陣列,hash臨時儲存...