基本排序方式——(六)基数排序

1.基本思想

  • 概念

基数排序不同于前面的几种排序方式,前面介绍的排序方法或多或少的是通过使用比较和移动来实现排序,而基数排序的实现不需要进行对关键字进行比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。

  • 思想

采用“桶子法”来实现。准备10个桶子,有两种方法,这两种思想都是一样的。
(1)最低位优先法:根据待排序数的个位的数来确定装入哪个桶,装入之后,然后取出,然后再根据十位上的数再装入桶,再取出,直到取到这组数中的最大数的最高位结束。(如图下所示)
在这里插入图片描述
上图中就是按照个位来放入“桶”中,然后取出
(2)最高位优先法:和上面的方法很像,就是从最大数的最高位开始,装,取,直到到个位时结束。

2.流程演示

以这组数为例进行演示:2,1,5,21,31,444,23,33,47
(1)第一步
在这里插入图片描述
(2)第二步
在这里插入图片描述
(3)第三步
在这里插入图片描述

3.设计思路

首先我们肯定需要确定“分配”和“收集”的次数,就要先求这组数中的最大值,然后确定最大值是几位数,这样就知道了装和取的次数。
(1)“分配”
我们可以创建一个二维数组来装入数据,长度为10,每个一维数组的长度是待排序数组的长度,因为极端情况下就是将待排序的数全部装入一个桶中。
(2)“收集”
收集就是每次分配结束后,将二维数组中的数取出来覆盖代排序数组中的数。可以创建一个统计数组,来记录每个桶中的装入的数的个数,方便取出数据。(如图所示)
在这里插入图片描述

4.代码实现

package com.westmo1.demo2;
import java.util.Arrays;
public class MyDemo6 {
    public static void main(String[] args) {
        int arr[]={2,1,5,21,31,444,23,33,47,10,903,124,987,100};
        SortArray(arr);
        System.out.println(Arrays.toString(arr));
    }
    private static void SortArray(int[] arr) {
        //获取数组中的最大值
        int max=getMax(arr);
        int length = String.valueOf(max).length();
        //创建二维数组用来存取数
        int[][] temparr = new int[10][arr.length];
        //创建统计数组
        int[] count = new int[10];
        for (int i = 0,n=1; i < length; n=n*10,i++) {
            for (int i1 = 0; i1 < arr.length; i1++) {
                   //获取每个位上的数字
                int ys=arr[i1]/n%10;
                //将数装入桶中
                temparr[ys][count[ys]++]=arr[i1];
            }
              //取出数据
            int index=0;
            for (int k = 0; k < count.length; k++) {
                if(count[k]!=0){
                    for (int i1 = 0; i1 < count[k]; i1++) {
                        arr[index]=temparr[k][i1];
                        index++;
                    }
                    count[k]=0;
                }
            }
        }
    }
    private static int getMax(int[] arr) {
        int max=0;
        for (int i = 0; i < arr.length; i++) {
            if(max<=arr[i]){
                max=arr[i];
            }
        }
        return max;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值