基数排序-非比较排序,多关键字排序

package com.example.sort.radix;

import java.util.Arrays;

public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {421, 240, 115, 532, 305, 430, 124};
        // 求最大数位数
        int temp = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (temp < arr[i]) {
                temp = arr[i];
            }
        }
        int bit = String.valueOf(temp).length();
        int[] result = sort(arr, bit);
        System.out.println(Arrays.toString(result));
    }

    /**
     * 基数排序
     *
     * @param arr
     */
    private static int[] sort(int[] arr, int bit) {
        //创建临时存储数组
        int[] result = new int[arr.length];
        // 建立0-9容器
        int[] count = new int[10];
        for (int i = 0; i < bit; i++) {
            // 10的i次方
            int division = (int) Math.pow(10, i);
            System.out.println(division);
            for (int j = 0; j < arr.length; j++) {
                int num = arr[j] / division % 10;
                System.out.println(num + "");
                count[num]++;
            }
            // 计数排序的优化
            for (int m = 1; m < count.length; m++) {
                count[m] = count[m] + count[m - 1];
            }
            for (int n = arr.length - 1; n >= 0; n--) {
                int num = arr[n] / division % 10;
                result[--count[num]] = arr[n];
            }
            // 一轮结束,替换原数组arr的位置
            System.arraycopy(result, 0, arr, 0, arr.length);
            // 清空count数组
            Arrays.fill(count, 0);
        }
        return result;
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    private static void print(int[] arr) {

        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

  

原文地址:https://www.cnblogs.com/huan30/p/12850550.html