基数排序

package com.zha.wmls.sort;

import java.util.Arrays;

/**
 * @ClassName RadixSort
 * @Desc 基数排序
 * @Author wmls
 * @Date 2021/6/21 15:37
 * @Version 1.0
 */
public class RadixSort {
    public static void main(String[] args) {
        int[] arr = { 53, 3, 542, 748, 14, 214};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 通过一个二维数组,每次把数放在二维数组里,然后再排序
     * @param arr
     */
    public static void radixSort(int[] arr){
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (max < arr[i]){
                max = arr[i];
            }
        }
        //得到数字的长度
        int count = (max + "").length();
        for (int k = 0, num = 1; k < count; k++, num = num*10){
            int[][] bucketArr = new int[10][arr.length];
            //用来表示每个桶中存放了几个数据
            int[] bucketIndexArr = new int[10];
            for (int value : arr) {
                int n = value / num % 10;
                //放入到对应的桶中
                bucketArr[n][bucketIndexArr[n]++] = value;
            }
            //把桶里的数据放回原数组,需要用到双循环
            int index = 0;
            for (int i = 0; i < 10; i++) {
                //桶中有数据才执行
                if (bucketIndexArr[i] != 0){
                    for (int j = 0; j < bucketIndexArr[i]; j++) {
                        arr[index++] = bucketArr[i][j];
                    }
                }
                //将桶中的数据给到arr中后就清零,下一轮循环继续使用
                bucketIndexArr[i] = 0;
            }
        }
    }
}

 

posted @ 2021-06-22 09:26  wmls  阅读(101)  评论(0)    收藏  举报