• 基数排序或者说是桶排序


    基数排序的基本思路

    521  123  496  333  224

    假设有这几个数

    排序的基本过程是

    先获取这五个数各位上的数,根据数对号入桶(所以需要十个桶子,0~9的下标分别对应这是存放数字几的桶子)

    第一次:

    521入一号桶  123入三号桶  496入6号桶  333入三号桶  224入4号桶

    再分别将0~9号桶中的数据取出   521  333  123  496  224

    第二次:十位入桶

    521 123 224 333 496  ———》  224  123  521  333  496

    第三次:百位入桶

    123 224 333 496 521 ———》   123  224  333  496  521

        public static void radixSort(int [] array){
            //根据每一遍的结果可以知道,要先获得最大数的长度
            int max = 0;
            for (int i = 0; i < array.length; i++) {
                if (array[max] < array[i]){
                    max = i;
                }
            }
            int maxLength = (array[max] + "").length();
            //用一个二维数组来当桶子存放数据,行从上到下存放数据,列就表示各个位的数对对应桶子
            //各个位的数字的范围是0~10 ,每个桶子最多存放array.length个数据
            int [] [] temp = new int[10][array.length];
            //先从第一轮排序的情况分析
            //count用来记录每个桶子中存放的数据的个数,count[0]对应的数字就是桶子0中的元素个数...
            int [] count = new int [10];
            //遍历数组,根据个位信息对号入桶
            int n = 0;
            int k = 1;
            while (n < maxLength){
                for (int value : array) {
                    int number = value / k % 10;
                    temp[number][count[number]] = value;
                    count[number]++;
                }
                //全部对号入桶之后再将入桶的数据全部取出
                int index = 0;
                for (int i = 0; i < 10; i++) {
                    if (count[i] != 0){
                        for (int j = 0; j < count[i]; j++) {
                            array[index++] = temp[i][j];
                        }
                        count[i] = 0;
                    }
                }
                k *= 10;
                n ++;
            }
        }
  • 相关阅读:
    (DP)codeforces
    (树状数组)POJ
    (树状数组)POJ
    (二维树状数组)POJ
    (模拟)HDU
    (暴力+深搜)POJ
    (判连通+暴力)UVA
    (深搜)UVA
    (暴力+各种算法)hihoCoder
    (尺取法)HDU
  • 原文地址:https://www.cnblogs.com/zzxisgod/p/13336075.html
Copyright © 2020-2023  润新知