目录
基数排序介绍
基数排序图解![](https://i-blog.csdnimg.cn/blog_migrate/0a065771c09c5b4c491d4e9fea817256.png)
分步骤解释
package 基数排序;
import java.util.Arrays;
//分步骤解释~
public class RadixSort {
public static void main(String[] args) {
int[] arr={50,59,92,777,22,5,16,18};
radixSort(arr);
}
public static void radixSort(int[] arr){
//定义一个数组,表示十个桶,每个桶就是一个一维数组
//说明:
//1.二维数组包含10个一维数组
//2.为了防止在放入数的时候,数据溢出,则每个一维数组(桶),大小定位arr.length
//3.基础排序是使用空间换时间的经典算法
int[][] bucket=new int[10][arr.length];
//为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组来记录各个桶的放入数据的数据个数
//这样理解:bucketElementCounts[0],记录的就是bucket[0]桶的放入数据个数
int[] bucketElementCounts=new int[10];
//第一轮:(针对每个元素的个位进行排序处理,若是一位数,前面是0)
for (int i=0;i<arr.length;i++){
//先取出每个元素的个位
int digitOfElement=arr[i]/1%10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]]=arr[i];
bucketElementCounts[digitOfElement]++;
}
//按照这个桶的顺序(一维数组的下标依次取出,放入原来数组)
int index=0;
//遍历每一桶,并将桶中数据放入到原数组
for (int k=0;k<bucketElementCounts.length;k++){
//如果桶中有数据我们才放入到原数组
if (bucketElementCounts[k]!=0){
for (int l=0;l<bucketElementCounts[k];l++) {
arr[index] = bucket[k][l];
index++;
}
}
bucketElementCounts[k]=0;
}
System.out.println("第一轮:"+ Arrays.toString(arr));
//第二轮:(针对每个元素的个位进行排序处理,若是一位数,前面是0)
for (int i=0;i<arr.length;i++){
//先取出每个元素的个位
int digitOfElement=arr[i]/10%10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]]=arr[i];
bucketElementCounts[digitOfElement]++;
}
//按照这个桶的顺序(一维数组的下标依次取出,放入原来数组)
index=0;
//遍历每一桶,并将桶中数据放入到原数组
for (int k=0;k<bucketElementCounts.length;k++){
//如果桶中有数据我们才放入到原数组
if (bucketElementCounts[k]!=0){
for (int l=0;l<bucketElementCounts[k];l++) {
arr[index] = bucket[k][l];
index++;
}
}
bucketElementCounts[k]=0;
}
System.out.println("第二轮:"+ Arrays.toString(arr));
//第三轮:(针对每个元素的个位进行排序处理,若是一位数,前面是0)
for (int i=0;i<arr.length;i++){
//先取出每个元素的个位
int digitOfElement=arr[i]/100%10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]]=arr[i];
bucketElementCounts[digitOfElement]++;
}
//按照这个桶的顺序(一维数组的下标依次取出,放入原来数组)
index=0;
//遍历每一桶,并将桶中数据放入到原数组
for (int k=0;k<bucketElementCounts.length;k++){
//如果桶中有数据我们才放入到原数组
if (bucketElementCounts[k]!=0){
for (int l=0;l<bucketElementCounts[k];l++) {
arr[index] = bucket[k][l];
index++;
}
}
}
System.out.println("第三轮:"+ Arrays.toString(arr));
}
}
最终版本
package 基数排序;
import java.util.Arrays;
public class RadixSort_2 {
public static void main(String[] args) {
int[] arr = {50, 59, 92, 777, 22, 5, 16, 18};
radixSort(arr);
}
public static void radixSort(int[] arr) {
//定义一个数组,表示十个桶,每个桶就是一个一维数组
//说明:
//1.二维数组包含10个一维数组
//2.为了防止在放入数的时候,数据溢出,则每个一维数组(桶),大小定位arr.length
//3.基础排序是使用空间换时间的经典算法
int[][] bucket = new int[10][arr.length];
//为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组来记录各个桶的放入数据的数据个数
//这样理解:bucketElementCounts[0],记录的就是bucket[0]桶的放入数据个数
int[] bucketElementCounts = new int[10];
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
int maxLength = (max + "").length();
for (int j = 0,n=1; j < maxLength; j++,n=n*10) {//个位 十位 百位等等
for (int i = 0; i < arr.length; i++) {
//先取出每个元素的个位
int digitOfElement = arr[i] / n % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[i];
bucketElementCounts[digitOfElement]++;
}
//按照这个桶的顺序(一维数组的下标依次取出,放入原来数组)
int index = 0;
//遍历每一桶,并将桶中数据放入到原数组
for (int k = 0; k < bucketElementCounts.length; k++) {
//如果桶中有数据我们才放入到原数组
if (bucketElementCounts[k] != 0) {
for (int l = 0; l < bucketElementCounts[k]; l++) {
arr[index] = bucket[k][l];
index++;
}
}
bucketElementCounts[k] = 0;
}
System.out.println("第"+(j+1)+"轮:" + Arrays.toString(arr));
}
}
}