Live2D
Fork me on GitHub

20、排序算法-基数排序

来源:https://www.bilibili.com/video/BV1B4411H76f?p=60

一、思路

基数排序:属于分配式排序,将要排序的元素按照位(个十百)分配到“桶”中。

 

例如:[53,3,542,748,14,214]从小到大

统一 待比较数据的长度,高位补零。设置10个“桶”,按照0-9依次排列。

第一趟(看个位):遍历数组填入数据

  0:没有

  1:没有

  2:542

  3:53, 3

  4:14, 214

  5:没有

  6:没有

  7:没有

  8:748

  9:没有

按照桶内的位置依次取出[542,53,3,14,214,748]

第二趟(看十位):  

  0:3

  1:14, 214

  2:没有

  3:没有

  4:542,748

  5:53

  6:没有

  7:没有

  8:没有

  9:没有

按照桶内的位置依次取出[3,14,214,542,748,53]

第三趟(看百位):  

  0:3,14, 53

  1:没有

  2:214

  3:没有

  4:没有

  5:542

  6:没有

  7:748

  8:没有

  9:没有

按照桶内的位置依次取出[3,14,53,214,542,748]完成

二、实现

 1 //基数排序
 2 public class RadixSort {
 3     public static void main(String[] args) {
 4         int[] arr = {53,3,542,748,14,214};
 5         System.out.println(Arrays.toString(arr));
 6 
 7         radixSort(arr);
 8         System.out.println(Arrays.toString(arr));
 9     }
10 
11     public static void radixSort(int[] arr){
12         //统一数据长度
13         int max = arr[0];
14         for (int i = 0; i < arr.length; i++) {
15             if(arr[i] > max){
16                 max = arr[i];
17             }
18         }
19         int maxLength = (max + "").length();
20 
21         //桶,0-9,每个桶最多装arr.length个数据
22         int[][] bucket = new int[10][arr.length];
23 
24         //统计桶内的数据个数
25         int[] bucketCounts = new int[10];
26 
27         //按照位来
28         for (int i = 0,n=1; i < maxLength; i++,n *= 10) {
29             //遍历数组
30             for (int j = 0; j < arr.length; j++) {
31                 //看当前位是几
32                 int digit = arr[j] / n % 10;
33                 bucket[digit][bucketCounts[digit]] = arr[j];
34                 bucketCounts[digit]++;
35             }
36             //放完数据开始取
37             int index = 0;
38             for (int k = 0; k < bucketCounts.length; k++) {
39                 if(bucketCounts[k] != 0){
40                     //桶中有数据
41                     for (int l = 0; l < bucketCounts[k]; l++) {
42                         arr[index] = bucket[k][l];//第k个桶,第l个数据
43                         index++;
44                     }
45                     bucketCounts[k] = 0;//清空桶
46                 }
47             }
48         }
49     }
50 }

结果

[53, 3, 542, 748, 14, 214]
[3, 14, 53, 214, 542, 748]

 

posted @ 2020-06-19 18:53  -小二黑-  阅读(206)  评论(0编辑  收藏  举报