java内部排序之基数排序

基数排序(桶排序)

思想:

将所有待比较数值统一为同样的数位长度,数位较短的数前面补0,然后从最低位开始,一次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

将数组{53,3,542,748,14,214}使用基数升序排序步骤如下:

代码如下:

private static void radixSort(Integer[] arr){
   //获得数组中最大数的位数
   int max=arr[0];
   for(int i=0;i<arr.length;i++){
       if(arr[i]>max){
           max=arr[i];
       }
   }
   //得到最大数是几位数
   int maxLength=(max+"").length();
   //定义一个二位数组,表示10个桶,每个桶就是一维数组
    //为了防止在放入书的时候数据溢出,则每个桶大小定为arr.length
    int[][] bucket=new int[10][arr.length];
    //为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数
    int[] bucketElementCounts=new int[10];
    //bucketElementCounts[0]表示bucket[0]存放的数据个数
    for(int i=0,n=1;i<maxLength;i++,n*=10){
        //针对每个元素的对应位进行排序处理,第一次是个位,第二次是十位,第三次是百位
        for(int j=0;j<arr.length;j++){
            //取出每个元素的对应位的值
            int digitOfElement=arr[j]/n%10;
            //放入到对应的桶中
            bucket[digitOfElement][bucketElementCounts[digitOfElement]]=arr[j];
            bucketElementCounts[digitOfElement]++;
        }
        //按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
        int index=0;
        //遍历每一个桶并将桶中数据放入原数组
        for(int k=0;k<bucketElementCounts.length;k++){
            //如果桶中,有数据,我们才放入到原数组
            if(bucketElementCounts[k]!=0){
                //循环该桶即第k个桶
                for(int l=0;l<bucketElementCounts[k];l++){
                    arr[index++]=bucket[k][l];
                }
            }
            //第i+1轮处理后,需要将每个bucketElementCounts[k]=0
            bucketElementCounts[k]=0;
        }
    }
}
发布了59 篇原创文章 · 获赞 2 · 访问量 2064

猜你喜欢

转载自blog.csdn.net/zuodaoyong/article/details/103574928