【code基础】基数排序java实现

思路

总体思想如下:

  1. 从个位开始从小到大排列
  2. 从十位开始从小到大有序排列
  3. 以此类推
  4. 直到最高位排列完毕,即得到整个数组的排序完毕

代码实现

思路整理:

  1. 获得数组的最高位
  2. 求取第k位对应的元素,算法为arr[j]/a[i])%10,其中a[i]是个辅助变量{1,10,100,...},与最高位有关,简化循环用的
  3. 统计每个基数桶中相同的元素个数,使用count数组存取位置信息
  4. 将arr数组按照count数组的位置信息填充到bucket数组中
  5. 将bucket数组赋值到arr数组中
  public void radixSort(){
        int[] arr = {21,56,88,195,354,1,35,12,6,7};
        int[] bucket = new int[arr.length]; //临时存储有序的数组
        int[] count = new int[arr.length]; //计算数组位置的数组
        int n = 3;
        int[] a = {1,10,100};

        for (int i = 0; i < n; i++) {
            //1.初始清空count数组
            for (int k = 0; k < arr.length; k++) {
                count[k]=0;
            }
            //2.计算arr数据对应的基数个数,填充count数组
            for (int j = 0; j < arr.length; j++) {
                count[(arr[j]/a[i])%10]++;
            }
            //3.更新count数组,值表明对应的基数桶右边界的位置(右闭)
            //开始计算位置,从0开始往后摞盘子,所以只顾看自己和前一个的位置即可
            for (int k = 1; k < arr.length; k++) {
                count[k] = count[k]+count[k-1];
            }

            //4. 把arr数据落入各个桶中,这里需要从后往前装
            for (int k = arr.length-1; k >= 0; k--) {
                int j = (arr[k]/a[i])%10;
                bucket[count[j]-1] = arr[k];
                count[j]--;
            }

            //5. 将桶中的数据取出来,赋值给arr
            for (int k = 0; k < arr.length; k++) {
                arr[k]=bucket[k];
            }
        }


        for (int num : arr) {
            System.out.println(num);
        }    
    }
posted @ 2022-09-24 14:57  xiaoyu_jane  阅读(22)  评论(0编辑  收藏  举报