八大基本排序--基数排序

Posted yuange678

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八大基本排序--基数排序相关的知识,希望对你有一定的参考价值。

原数组和桶如下:

技术图片

第一次按照个位排序如下

技术图片

取出的时候按照从0~9的顺序,且同一个桶中,先放进去的先出来

技术图片

第二次按照十位排序如下

技术图片

取出结果如下

技术图片

第三次次按照百位排序如下

技术图片

取出结果如下:

此时数组已经有序了

技术图片

 

代码思路:

我们排序的次数取决于数组中最大是数字的位数

技术图片

import java.util.Arrays;

//基数排序
public class RadixSort {

    public static void main(String[] args) {
        int[] arr = { 23, 6, 189, 45, 9, 287, 56, 1, 798, 34, 65, 652, 5 };
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void radixSort(int[] arr) {
        //先找到这个数组里面最大的数字
        //排多少轮,取决于数组中最大的数字是几位数
        int max=arr[0];
        for(int i=1;i<arr.length;i++) {
            if(arr[i]>max) {
                max = arr[i];
            }
        }
//        System.out.println(max);
        //计算取到的最大值max是几位数:把max变成字符串类型,然后计算其长度
        String maxs = "";
        maxs = maxs+max;
        int maxLen = maxs.length();
//        System.out.println(maxLen);
        
        //用于临时存放数据的数组(那0-9的十个桶)
        int[][] temp = new int[10][arr.length];
        //用于记录temp中每一个桶中存放数据的数量
        int[] count =new int[10];
        
        //根据最大长度决定比较的次数
        for(int i= 0, n=1;i<maxLen;i++,n=n*10) {
            //取出数组中每个数字的余数
            for (int j = 0; j < arr.length; j++) {
                int ys = arr[j]/n%10;
                temp[ys][count[ys]] = arr[j];//关键是放在第几列,需要用一个数组辅助计算
                count[ys]++;
            }
//            if (i==0) {
//                for (int[] temps : temp) {
//                    System.out.println(Arrays.toString(temps));
//                }
//                System.out.println(Arrays.toString(count));
//            }
            //
            int index =0;
            //把数字取出来,看count[]数组(记录数量)中的个数,如果个数=0,就不取
            for(int k=0;k<10;k++) {
                if(count[k]!=0) {
                    //遍历temp[][]数组
                    for(int l =0;l<count[k];l++) {
                        arr[index++]=temp[k][l];
                    }
                }
                //把数量置为0
                count[k]=0;
            }
        }
    }
}

以上是关于八大基本排序--基数排序的主要内容,如果未能解决你的问题,请参考以下文章

Python八大算法的实现,插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序。

八大排序算法Java实现(下)-快排归排基数排序

八大排序算法的python实现基数排序

20191209-八大排序之基数排序

一篇秒懂八大排序

一篇秒懂八大排序