首页 > 编程语言 >20 -- 排序算法之基数排序

20 -- 排序算法之基数排序

时间:2022-10-08 21:22:25浏览次数:52  
标签:countOfBucket arr 20 index -- bucket ++ int 基数排序

 

 

 

 举例说明:

1、第一轮:按照每个元素的 个 位取出,然后将这个数放在对应的桶(数组)中;在按照这个桶的顺序,放入原来的数组中 -->

 

 2、第二轮:按照每个元素的 十 位取出, -->

 

  3、第三轮:按照每个元素的 百 位取出, -->

 总结:从中可以看到 --> 排序的次数 等于 待排序中的最大位数的个数

 代码实现:

  1 import java.util.Arrays;
  2 
  3 //基数排序(桶排序)
  4 public class RadixSort {
  5 
  6     public static void main(String[] args) {
  7         int[] arr = {53,3,542,748,14,214};
  8         radixSort2(arr);
  9     }
 10     
 11     public static void radixSort(int[] arr) {
 12         System.out.println("第一轮:针对每个元素的个位数进行排序");
 13         //第一轮:针对每个元素的个位数进行排序
 14         //定义10个桶(基数为0~9),为了防止极端情况(基数全部一样),每个桶的大小与数组中元素的个数一样【空间换时间】
 15         int[][] bucket = new int[10][arr.length];
 16         
 17         //记录每个桶中的位数
 18         int[] countOfBucket = new int[10];
 19         //放置
 20         int digitOfEmement = 0;
 21         for(int j = 0; j < arr.length; j ++) {
 22             digitOfEmement = arr[j] % 10;
 23             bucket[digitOfEmement][countOfBucket[digitOfEmement]] = arr[j];
 24             countOfBucket[digitOfEmement] ++;
 25         }
 26         
 27         //依次取出每个桶中的数据放入到数组中
 28         int index = 0;
 29         for(int i = 0; i < bucket.length; i++) {
 30             for(int j = 0; j < countOfBucket[i]; j++) {
 31                 arr[index] = bucket[i][j];
 32                 index ++;
 33             }
 34             //清空记录每个桶装的数据的个数,用于下次使用
 35             countOfBucket[i] = 0;
 36         }
 37         System.out.println(Arrays.toString(arr));
 38     
 39         System.out.println("第二轮:针对每个元素的十位数进行排序");
 40         for(int j = 0; j < arr.length; j++) {
 41             digitOfEmement = arr[j] / 10 % 10;
 42             bucket[digitOfEmement][countOfBucket[digitOfEmement]] = arr[j];
 43             countOfBucket[digitOfEmement] ++;
 44         }
 45         
 46         index = 0;
 47         for(int i = 0; i < bucket.length; i++) {
 48             for(int j = 0; j < countOfBucket[i]; j++) {
 49                 arr[index] = bucket[i][j];
 50                 index ++;
 51             }
 52             countOfBucket[i] = 0;
 53         }
 54         System.out.println(Arrays.toString(arr));
 55         
 56         
 57         System.out.println("第三轮:针对每个元素的百位数进行排序");
 58         for(int j = 0; j < arr.length; j++) {
 59             digitOfEmement = arr[j] / 100 % 10;
 60             bucket[digitOfEmement][countOfBucket[digitOfEmement]] = arr[j];
 61             countOfBucket[digitOfEmement] ++;
 62         }
 63         
 64         index = 0;
 65         for(int i = 0; i < bucket.length; i++) {
 66             for(int j = 0; j < countOfBucket[i]; j++) {
 67                 arr[index] = bucket[i][j];
 68                 index ++;
 69             }
 70             countOfBucket[i] = 0;
 71         }
 72         System.out.println(Arrays.toString(arr));
 73         
 74      }
 75 
 76     
 77     //总结出规律得出
 78     public static void radixSort2(int[] arr) {
 79         //定义十个桶,每个桶的大小为数组的长度
 80         int[][] bucket = new int[10][arr.length];
 81         
 82         //一维数组:记录每个桶中中放置的数据的个数
 83         int[] countOfBucket = new int[10];
 84         int max = arr[0]; //假设第一个数为数组中最大位数个数
 85         for(int i = 1; i < arr.length; i++) {
 86             if (arr[i] > max) {
 87                 max = arr[i];
 88             }
 89         }
 90         
 91         int maxLength = (max + "").length();
 92         
 93         int digitOfElemnt = 0;
 94         int index = 0;
 95         //i:根据最大位数循环
 96         //radix : 每次以...为基准【个、十、百、千 ...】
 97         for(int i = 0, radix = 1; i < maxLength; i++, radix *= 10) {
 98             for(int j = 0; j < arr.length; j++) {
 99                 //取出基准数
100                 digitOfElemnt = arr[j] / radix % 10; 
101                 //根据基准数入桶
102                 bucket[digitOfElemnt][countOfBucket[digitOfElemnt]] = arr[j];
103                 countOfBucket[digitOfElemnt] ++;
104             }
105             
106             index = 0;
107             //从0~9遍历桶,依次取出各个元素重新装入原数组中
108             for(int k = 0; k < bucket.length; k ++) {
109                 for(int l = 0; l < countOfBucket[k]; l ++) {
110                     arr[index] = bucket[k][l];
111                     index ++;
112                 }
113                 countOfBucket[k] = 0;
114             }
115             System.out.println("第" + (i+1) + "次:" + Arrays.toString(arr));
116         }
117         
118     }
119     
120 }

运行结果:

 

 总结【注意】:

从基数排序(桶排序)的示意图和代码实现部分可以看出,基数排序是典型的用空间换取时间的例子,并且它不适合做负数的排序。

标签:countOfBucket,arr,20,index,--,bucket,++,int,基数排序
From: https://www.cnblogs.com/yumengqifei/p/16671039.html

相关文章

  • 【Django-rest-framework框架】第06回 路由、登录、认证
    目录1.自动生成路由1.1本质1.2使用步骤1.3SimpleRouter与DefaultRouter区别1.4自动生成的路由映射关系其实定死了1.5action装饰器的使用1.6action装饰器的使用1.7......
  • n维偏序 方法记录
    题解首先我们要对一个地点能否到达建立认知:一个地点能到达不仅仅是能从它的上一个点或上上个点跳到,而是能从第一个点开始跳一路跳到。就好比说,咱吃了6个包子吃饱了,但咱......
  • 03 栈与递归 | 数据结构与算法
    1.栈栈的定义:限定在表尾进行插入和删除操作的线性表空栈:不换任何元素的栈栈顶top:允许插入删除的一端栈的操作(连续设计)置空栈make_null_stack()#definemaxn......
  • SPFA算法思想简述
    首先定义数组\(d_i\)表示起点到\(i\)的距离(除起点外初始化为最大值),并维护一个队列。初始将起点入队,然后每一次取队头\(x\)并且松弛所有与\(x\)相连的边,同时如果能......
  • CentOS 7 离线安装指定版本docker
    这里以docker-ce-18.06版本为例第一步:下载指定版本docker安装包wget--no-check-certificatehttps://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7.9/x86_64......
  • 文章详情页制作
    url的设计/usrname/article/1/用户名/article/文章主键值re_path(r'^(?P<username>\w+)/article/(?P<article_id>\d+)/$',views.article_detail,name='detail'),视图......
  • 零钱兑换问题
    零钱兑换问题作者:Grey原文地址:博客园:零钱兑换问题CSDN:零钱兑换问题题目描述给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返......
  • .NET Core和.NET Framework中DateTime.Now的区别
    今天和医院的微信公众号接口对接,需要传当前时间,我随手写了一个DateTime.Now传了过去,过了一会那边说时间格式不对,原来.NETCore中DateTime.Now的格式是2022/10/08下午04......
  • 2022NOIP联测5
    T1挑战题意:有两行字符串,有\(*\)和\(.\)两种字符,你可以进行一种操作,将一个格子的\(*\)推到相邻的格子,如果推到一个有\(*\)的格子,那么将\(*\)合并,求最后把所有......
  • Java 内部类内存泄漏
    一、内存泄漏原因  非静态内部类会有持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方......