1. 程式人生 > 其它 >Java 排序演算法: 基數排序

Java 排序演算法: 基數排序

技術標籤: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; } } } }

八百萬資料測試結果

在這裡插入圖片描述