基数排序法是属于稳定性的排序,基数排序法是效率高的稳定性排序。
代码实现
package com.atguigu.sort;
import java.util.Arrays;
/**
* @author WHT
* @create 2021-06-24 9:08
*/
public class RadixSort {
public static void main(String[] args) {
int[] arr = {53, 3, 542, 748, 14, 214};
System.out.println("排序前的数组:" + Arrays.toString(arr));
radixSort(arr);
}
// 基数排序方法。
public static void radixSort(int[] arr) {
// 得到数组中最大的数的位数。
int max = arr[0]; // 假设第一数就是最大数。
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 得到最大数是几位数。
int maxLength = (max + "").length();
//定义一个二维数组,表示10个桶, 每个桶就是一个一维数组
//说明
//1. 二维数组包含10个一维数组
//2. 为了防止在放入数的时候,数据溢出,则每个一维数组(桶),大小定为arr.length
//3. 名明确,基数排序是使用空间换时间的经典算法
int[][] bucket = new int[10][arr.length];
//(针对每个元素的对应位进行排序处理), 第一次是个位,第二次是十位,第三次是百位..
for (int i = 0; i < maxLength; i++) {
// 为了记录每个桶中,实际存放了多少个数据, 我们定义一个一维数组来记录各个桶的每次放入的数据个数。
int[] counts = new int[10];
for (int j = 0; j < arr.length; j++) {
// 取出每个元素的对应位的值。
int digit = arr[j] / (int)(Math.pow(10, i)) % 10;
// 放入到对应的桶中。
bucket[digit][counts[digit]] = arr[j];
counts[digit]++;
}
// 按照这个桶的顺序依次取出数据,放入原来数组。
int index = 0;
for (int k = 0; k < bucket.length; k++) {
for (int t = 0; t < counts[k]; t++) {
// 取出元素放入到arr。
arr[index] = bucket[k][t];
index++;
}
}
System.out.printf("第%d轮的排序结果:" + Arrays.toString(arr), i + 1);
System.out.println();
}
}
}
运行结果
D:\java\jdk-11.0.11\bin\java.exe "-javaagent:D:\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=1120:D:\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath E:\WHT\Project\Java\DataStructures\out\production\DataStructures com.atguigu.sort.RadixSort
排序前的数组:[53, 3, 542, 748, 14, 214]
第1轮的排序结果:[542, 53, 3, 14, 214, 748]
第2轮的排序结果:[3, 14, 214, 542, 748, 53]
第3轮的排序结果:[3, 14, 53, 214, 542, 748]
Process finished with exit code 0
800万随机数测试:8s 。