概述
Java中排序算法是非常重要的一部分,這裏簡單分析下基數排序(桶排序)的實現思路及其代碼實現。
常見排序算法時間複雜度表
排序算法 | 平均時間複雜度 | 最差情形 | 穩定度 | 額外空間 | 備註 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n^2) | 穩定 | O(1) | n小時較好 |
插入排序 | O(n^2) | O(n^2) | 穩定 | O(1) | n小時較好 |
選擇排序 | O(n^2) | O(n^2) | 不穩定 | O(1) | n小時較好 |
快速排序 | O(nlogn) | O(n^2) | 不穩定 | O(nlogn) | n大時較好 |
希爾排序 | O(nlogn) | O(n^s)1 < s < 2 | 不穩定 | O(1) | n大時較好 |
歸併排序 | O(nlogn) | O(nlogn) | 穩定 | O(1) | n大時較好 |
堆排序 | O(nlogn) | O(nlogn) | 穩定 | O(1) | n大時較好 |
基數排序 | O(nlogn) | OlogrB | O(n) | O(n) | B爲真數(0-9),r爲基數個十百 |
基數排序(桶排序)介紹
基數排序(radix sort)屬於分配式排序,又稱爲桶排序。顧名思義,它是通過鍵值的各個位數的值將要排序的元素分配至某些桶中,達到排序的作用。
基數排序屬於穩定性的排序,基數排序是一個效率高的穩定性排序法
基數排序是(Radix sort)是桶排序的擴展
基數排序的基本思想
- 將所有待比較數值統一爲同樣位數長度,位數較短的數前面補零。然後從最低位開始,依次進行排序。一直從最低位排到最高位後,數列便成爲了一個有序的數列了。
基數排序圖解
基數排序代碼實現(本代碼僅支持正整數)
public class RadixSort {
/**
* @param arr 待尋找的數組
* @return 數組中最大位數的長度
*/
public static int findMax(int[] arr) {
if (arr == null || arr.length <= 0) {
throw new IllegalArgumentException();
}
int max = arr[0];
for (int i = 1;i < arr.length;i++) {
if (max < arr[i]) {
max = arr[i];
}
}
int maxLength = ("" + max).length();
return maxLength;
}
/**
* 進行桶排序
* @param arr 待排序的數組
* @param 數組中最大數的位數
*/
public static void radixSort(int[] arr, int maxLength) {
if (arr == null || arr.length <= 0) {
throw new IllegalArgumentException();
}
// 創建10個桶,分別記錄數值爲(0 - 9)
int[][] bucket = new int[10][arr.length];
// 創建10個數組用來記錄每個桶中元素的個數
int[] bucketElementCounts = new int[10];
for (int i = 0,n = 1;i < maxLength;i++,n *= 10) {
for (int j = 0;j < arr.length;i++) {
int digitOfElement= arr[i] / n % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement] ++;
}
int index = 0;
for (int i = 0;i < bucketElementCounts.length;i++) {
if (bucketElementCounts[i] > 0) {
for (int j = 0; j < bucketElementCounts[i];j++) {
arr[index] = bucket[i][j];
index++;
}
bucketElementCounts[i] = 0;
}
}
}
}
}
代碼寫完,小弟能力有限,僅供參考!!!如有錯誤歡迎指出。