JAVA十大排序算法之基數(shù)排序詳解
基數(shù)排序
常見的數(shù)據(jù)元素一般是由若干位組成的,比如字符串由若干字符組成,整數(shù)由若干位0~9數(shù)字組成。
基數(shù)排序按照從右往左的順序,依次將每一位都當(dāng)做一次關(guān)鍵字,然后按照該關(guān)鍵字對數(shù)組排序,同時每一輪排序都基于上輪排序后的結(jié)果;當(dāng)我們將所有的位排序后,整個數(shù)組就達(dá)到有序狀態(tài)?;鶖?shù)排序不是基于比較的算法。
基數(shù)是什么意思?對于十進(jìn)制整數(shù),每一位都只可能是0~9中的某一個,總共10種可能。那10就是它的基,同理二進(jìn)制數(shù)字的基為2;對于字符串,如果它使用的是8位的擴展ASCII字符集,那么它的基就是256。
基數(shù)排序有兩種方法:
- MSD 從高位開始進(jìn)行排序
- LSD 從低位開始進(jìn)行排序
對于大小范圍為0~9的數(shù)的組合(若是兩位數(shù),就是個位數(shù)和十位數(shù)的組合),于是可以準(zhǔn)備十個桶,然后放到對應(yīng)的桶里,然后再把桶里的數(shù)按照0號桶到9號桶的順序取出來即可。

代碼實現(xiàn)
public class RadixSort {
public static final int[] ARRAY = {82, 50, 21, 5, 66, 48, 43, 79, 14, 37, 25};
public static int[] sort(int[] array) {
if (array.length < 2) return array;
//根據(jù)最大值算出位數(shù)
int max = array[0];
for (int temp : array) {
if (temp > max) {
max = temp;
}
}
//算出位數(shù)digit
int maxDigit = 0;
while (max != 0) {
max /= 10;
maxDigit++;
}
//創(chuàng)建桶并初始化
ArrayList<ArrayList<Integer>> bucket = new ArrayList<>();
for (int i = 0; i < 10; i++) {
bucket.add(new ArrayList<>());
}
//按照從右往左的順序,依次將每一位都當(dāng)做一次關(guān)鍵字,然后按照該關(guān)鍵字對數(shù)組排序,每一輪排序都基于上輪排序后的結(jié)果
int mold = 10;//取模運算
int div = 1;//獲取對應(yīng)位數(shù)的值
for (int i = 0; i < maxDigit; i++, mold *= 10, div *= 10) {
for (int j = 0; j < array.length; j++) {
//獲取個位/十位/百位......
int num = (array[j] % mold) / div;
//把數(shù)據(jù)放入到對應(yīng)的桶里
bucket.get(num).add(array[j]);
}
//把桶中的數(shù)據(jù)重新寫回去,并把桶的元素清空,開始第二輪排序
int index = 0;
for (int k = 0; k < bucket.size(); k++) {
//桶中對應(yīng)的數(shù)據(jù)
ArrayList<Integer> list = bucket.get(k);
for (int m = 0; m < list.size(); m++) {
array[index++] = list.get(m);
}
//清除桶
bucket.get(k).clear();
}
}
return array;
}
public static void print(int[] array) {
for (int i : array) {
System.out.print(i + " ");
}
System.out.println("");
}
public static void main(String[] args) {
print(ARRAY);
System.out.println("============================================");
print(sort(ARRAY));
}
}
時間復(fù)雜度
計數(shù)排序算法的時間復(fù)雜度是O(N+M),基數(shù)排序算法執(zhí)行了k次計數(shù)排序,所以基數(shù)排序算法的時間復(fù)雜度為O(K(N+M))。
算法穩(wěn)定性
從上面的分析可以看出,相同元素會按照順序放進(jìn)固定的桶內(nèi),取出的時候也是按照順序取出來的,所以基數(shù)排序算法是一種穩(wěn)定的排序算法。
基數(shù)排序 vs 桶排序 vs 計數(shù)排序
這三種排序算法都利用了桶的概念,但對桶的使用方法上有明顯差異
- 基數(shù)排序:根據(jù)每一位的關(guān)鍵字來分配桶
- 桶排序:存儲一定范圍的值
- 計數(shù)排序:每個桶只存儲一個類型值,但是數(shù)量不限

總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot四大神器之Actuator的使用小結(jié)
這篇文章主要介紹了SpringBoot四大神器之Actuator的使用小結(jié),詳細(xì)的介紹了Actuator的使用和端點的使用,有興趣的可以了解一下2017-11-11
IntelliJ IDEA將導(dǎo)入的項目轉(zhuǎn)成maven項目
這篇文章主要介紹了IntelliJ IDEA將導(dǎo)入的項目轉(zhuǎn)成maven項目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
在這篇文章中給大家繼續(xù)講解包裝類的裝箱和拆箱問題。你可能會很好奇,做java開發(fā),怎么還裝起箱子來了?那么就請大家?guī)е苫笸驴窗?/div> 2023-04-04
詳解Java去除json數(shù)據(jù)中的null空值問題
這篇文章主要介紹了詳解Java去除json數(shù)據(jù)中的null空值問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08最新評論

