排序算法-基数排序(Java)

package com.rao.sort;

import java.util.*;

/**
 * @author Srao
 * @className RadioSort
 * @date 2019/12/10 18:17
 * @package com.rao.sort
 * @Description 基数排序
 */
public class RadioSort {

    /**
     * 基数排序
     * @param arr
     * @return
     */
    public static int[] radioSort(int[] arr){
        //1.找出最大值
        int n = arr.length;
        int max = arr[0];
        for (int i = 1; i < n; i++) {
            if (max < arr[i]){
                max = arr[i];
            }
        }

        //2.求出对大值的位数
        int num = 1;
        while (max / 10 > 0){
            num++;
            max /= 10;
        }

        //3.创建桶
        List<LinkedList<Integer>> bucketList = new ArrayList<>(10);

        //4.初始化桶
        for (int i = 0; i < 10; i++) {
            bucketList.add(new LinkedList<>());
        }

        //5.把每个数放到对应的桶当中
        for (int i = 1; i <= num; i++){
            for (int j = 0; j < n; j++) {
                int index = (int) ((arr[j]/Math.pow(10, i-1)) % 10);
                bucketList.get(index).add(arr[j]);
            }

            //6.把桶中的数输出到原数组
            int k = 0;
            for (int j = 0; j < 10; j++){
                for (Integer integer : bucketList.get(j)) {
                    arr[k] = integer;
                    k++;
                }
                //清除桶中的元素
                bucketList.get(j).clear();
            }
        }
    return arr;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{3,6,2,5,9,1,0,8};
        System.out.println(Arrays.toString(arr));
        arr = radioSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

  基数排序是按照个位,十位,百位。。。这种顺序来排序的。

  1.先比较数的个位,按照不同的大小放在10个桶里面,然后把桶中的数返回给原数组。

  2.然后比较十位,按照十位的大小把所有的数放在0-9这10个桶里面,然后把桶中的数返回给原数组。

  3.以此类推,在比较完最高位之后,数组中的数就是有序的了。

  

 

 

posted @ 2019-12-10 18:44  饶一一  阅读(226)  评论(0编辑  收藏  举报