Java 排序演算法: 基數排序
阿新 • • 發佈:2021-02-03
技術標籤:Java演算法及JDK原始碼探究日常小知識隨筆我的百寶箱演算法資料結構排序演算法
基數排序
基本思想:
基數排序(radixSort)屬於"分配式排序", 又稱為"桶子法" 或 bin sort, 顧名思義, 它是通過鍵值的各個位的值, 將要排序的元素分配到某些’桶’中, 達到排序的目的.
特點如下:
(1)通過鍵值得各個位的值,將要排序的元素分配至一些桶中,達到排序的作用
(2)基數排序法是屬於穩定性的排序,基數排序法是效率高的穩定排序法
(3)基數排序是桶排序的擴充套件
程式碼實現
package com.com.beyond.dhl. utils.sort;
import java.util.Arrays;
public class radixSort {
public static void main(String[] args) {
// int[] arr = {1, 5, 3, 2, 6, 7, 0};
// System.out.println("基數排序前:" + Arrays.toString(arr));
// radixSort(arr);
// System.out.println("基數排序後:" + Arrays.toString(arr));
int[] test = new int[8000000]; // 測試資料
for (int i = 0; i < test.length; i++) {
test[i] = (int) (Math.random() * 1000000); // 隨機生成一個 [0,1000000) 數
}
long start = System.currentTimeMillis();
radixSort(test);
long end = System.currentTimeMillis();
System. out.println("八百萬個隨機數使用基數排序所耗時間為: " +(end - start) + "毫秒");
}
public static void radixSort(int[] arr) {
// 1. 先得到陣列中最大的數的位數
int max = arr[0]; // 假設第一個數就是最大數
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 2. 得到最大數是幾位數
int maxLength = (max + "").length();
// 定義一個二維陣列, 表示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 i = 0, n = 1; i < maxLength; i++, n *= 10) {
// 針對於每個元素的對應位進行排序, 第一次是個位,第二次是10位...
for (int j = 0; j < arr.length; j++) {
//取出每個元素的對應位的值
int digitOfElement = arr[j] / n % 10;
// 放入到對應的桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
}
// 按照這個桶的順序(一維陣列的下標依次取出資料, 放入到原來陣列)
int index = 0;
// 遍歷每一桶, 並將桶中是資料, 放入到原陣列
for (int k = 0; k < bucketElementCounts.length; k++) {
// 如果桶中有資料, 我們才會放入到原陣列
if (bucketElementCounts[k] != 0){
// 迴圈改桶即第k個桶(即第k個一維陣列),放入
for (int l=0; l<bucketElementCounts[k];l++){
// 取出元素放入到arr
arr[index++] = bucket[k][l];
}
}
// 第i+1輪處理後, 需要將每個 bucketElementCounts[k] = 0
bucketElementCounts[k] = 0;
}
}
}
}