基數排序——Java實現


一、基數排序思想

       相比其它排序,主要是利用比較和交換,而基數排序則是利用分配和收集兩種基本操作。基數 排序是一種按記錄關鍵字的各位值逐步進行排序的方法。此種排序一般適用於記錄的關鍵字為整數類型的情況。所有對於字符串和文字排序不適合。

      實現:將所有待比較數值(自然數)統一為同樣的數位長度,數位較短的數前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列。

      基數排序的兩種方式:

  1. 高位優先,又稱為最有效鍵(MSD),它的比較方向是由右至左;
  2. 低位優先,又稱為最無效鍵(LSD),它的比較方向是由左至右;

二、圖解

基數排序實例1

堆排序動畫演示

三、代碼實現

/**
 * 基數排序演示
 *
 * @author Lvan
 */
public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {63, 157, 189, 51, 101, 47, 141, 121, 157, 156,
                194, 117, 98, 139, 67, 133, 181, 12, 28, 0, 109};

        radixSort(arr);

        System.out.println(Arrays.toString(arr));
    }

    /**
     * 高位優先法
     *
     * @param arr 待排序列,必須為自然數
     */
    private static void radixSort(int[] arr) {
        //待排序列最大值
        int max = arr[0];
        int exp;//指數

        //計算最大值
        for (int anArr : arr) {
            if (anArr > max) {
                max = anArr;
            }
        }

        //從個位開始,對數組進行排序
        for (exp = 1; max / exp > 0; exp *= 10) {
            //存儲待排元素的臨時數組
            int[] temp = new int[arr.length];
            //分桶個數
            int[] buckets = new int[10];

            //將數據出現的次數存儲在buckets中
            for (int value : arr) {
                //(value / exp) % 10 :value的最底位(個位)
                buckets[(value / exp) % 10]++;
            }

            //更改buckets[i],
            for (int i = 1; i < 10; i++) {
                buckets[i] += buckets[i - 1];
            }

            //將數據存儲到臨時數組temp中
            for (int i = arr.length - 1; i >= 0; i--) {
                temp[buckets[(arr[i] / exp) % 10] - 1] = arr[i];
                buckets[(arr[i] / exp) % 10]--;
            }

            //將有序元素temp賦給arr
            System.arraycopy(temp, 0, arr, 0, arr.length);
        }

    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM