Java数据结构与算法——基数排序(图解 代码实现)

基数排序

介绍:

(1)基数排序(radixsort) 属于“分配式排序,又称“桶子法” (bucketsort)。 顾名思义,它是通过键值的各 个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用
(2)基数排序法是属于稳定性的排序,基数排字法的是效率高的稳定性排序法
(3)基数排序(Radix Sort)是桶排序的扩展

说明:
1)基数排序是对传统桶排序的扩展,速度很快.
2)基数排序是经典的空间换时间的方式,占用内存很大,当对海量数据排序时,容易造成OutOfMemoryError。
3)基数排序是稳定的。[注 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[i], 且r[i在r(i]之前, 而在排序后的序列中,r[i]仍在ri]之 前,则称这种排序算法是稳定的;否则称为不稳定的]

基数排序基本思想
1)将所有待比较数值统一为同样 的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
2)这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤。

第一轮
在这里插入图片描述
第二轮

在这里插入图片描述
第三轮

在这里插入图片描述
代码实现

package sort;

import java.util.Arrays;

public class RadixSort {



    public static void main(String[] args) {
        int arr[] = {53,3,542,748,14,214};
        radixSort(arr);
        System.out.println("第一轮 arr="+Arrays.toString(arr));
    }
    //基数排序方法
    public static void radixSort(int[] arr) {

        int max = arr[0]; // 假设第一个是最大数
        for (int i = 1; i < arr.length; i++){
            if (max < arr[i]){
                max = arr[i];
            }
        }
        //得到最大位数
        int maxLength = (max + "").length();


        for (int i = 0,n = 1; i<maxLength;i++,n*=10){
            //针对每个元素的个位进行排序  个位 十位 百位
            //定义二维数组,表示10个桶

            int[][] bucket = new int[10][arr.length];

            //记录每个桶,实际放入了多少数据,我们定义一个一维数组记录各个桶放入的个数
            int[] bucketElementCounts = new int[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){
                    //循环该桶 放数据
                    for (int l = 0;l < bucketElementCounts[k];l++){
                        //取出元素放入arr
                        arr[index] = bucket[k][l];
                        index++;
                    }
                }
                //每次取出,需要将桶清空。
                bucketElementCounts[k] = 0;
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值