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]