基数排序
将数组中的每个数分别按个位、十位、百位…进行排序。
获取数中的每一位
public static void main(String[] args){
int number = 23456;
int bit;
// 个位
System.out.print("该数的个位:");
bit = number % 10;
System.out.println(bit);
// 十位
System.out.print("该数的十位:");
bit = number / 10 % 10;
System.out.println(bit);
// 百位
System.out.print("该数的百位:");
bit = number / 100 % 10;
System.out.println(bit);
// 千位
System.out.print("该数的千位:");
bit = number / 1000 % 10;
System.out.println(bit);
// 万位
System.out.print("该数的万位:");
bit = number / 10000 % 10;
System.out.println(bit);
}
该数的个位:6
该数的十位:5
该数的百位:4
该数的千位:3
该数的万位:2
基本实现
// 基数排序
public class RadixSort {
// 排序
public int[] sort(int[] array){
if(array.length == 0)
return null;
//找到最大值的位数
int maxBit = 1;
int number = 10; // 10,100,1000...
for(int i = 0;i < array.length;i ++){
if(array[i] >= number){
number = number * 10;
maxBit ++;
}
}
System.out.println("最大值的位数:" + maxBit);
return sort(maxBit,array);
}
// 实现排序
// 传入最大值的位数,要排序的数组
private int[] sort(int maxBit,int[] array) {
// 创建二维数组来储存每次得到的数
int[][] arrays = new int[10][array.length]; // 二维数组里创建十个数组,长度为要排序数组长度
int[] numberes; // 记录二维数组中每个数组内的个数
// 排个位
numberes = new int[10];
int bit; // 取余得到的数
for (int i = 0; i < array.length; i++) {
// 拿到每个数的个位
bit = array[i] % 10; // 取余
// 将排序数组中的数添加到二维数组中相应的位置
arrays[bit][numberes[bit]] = array[i];
// 个数加1
numberes[bit]++;
}
// 得到新数组
int index = 0; // 排序数组的索引
for (int i = 0; i < 10; i++) {
for (int j = 0; j < numberes[i]; j++) {
array[index] = arrays[i][j];
index++;
}
}
System.out.println("第一次排序:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
// 排十位
numberes = new int[10];
int s_bit;
for (int i = 0; i < array.length; i++) {
s_bit = (array[i] / 10) % 10;
arrays[s_bit][numberes[s_bit]] = array[i];
numberes[s_bit]++;
}
int s_index = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < numberes[i]; j++) {
array[s_index] = arrays[i][j];
s_index++;
}
}
System.out.println("第二次排序:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
// 第三次排序
numberes = new int[10];
int t_bit;
for (int i = 0; i < array.length; i++) {
t_bit = (array[i] / 100) % 10;
arrays[t_bit][numberes[t_bit]] = array[i];
numberes[t_bit]++;
}
int t_index = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < numberes[i]; j++) {
array[t_index] = arrays[i][j];
t_index++;
}
}
System.out.println("第三次排序:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
return array;
}
}
测试类
// 测试类
public class Demo {
public static void main(String[] args) {
int[] array = new int[]{
10,2,9,121,28,56,88,137};
RadixSort sort = new RadixSort();
array = sort.sort(array);
System.out.println();
System.out.println("排好序的数组:");
for(int i : array){
System.out.print(i + " ");
}
}
}
结果
最大值的位数:3
第一次排序:
10 121 2 56 137 28 88 9
第二次排序:
2 9 10 121 28 137 56 88
第三次排序:
2 9 10 28 56 88 121 137
排好序的数组:
2 9 10 28 56 88 121 137
优化
// 基数排序
public class RadixSort {
// 排序
public int[] sort(int[] array){
if(array.length == 0)
return null;
//找到最大值的位数
int maxBit = 1;
int number = 10;
for(int i = 0;i < array.length;i ++){
if(array[i] >= number){
number = number * 10;
maxBit ++;
}
}
System.out.println("最大值的位数:" + maxBit);
return sort(maxBit,array);
}
// 实现排序
private int[] sort(int maxBit,int[] array){
// 二维数组储存每次得到的数
// 创建二维数组来储存每次得到的数
int[][] arrays = new int[10][array.length]; // 二维数组里创建十个数组,长度为要排序数组长度
int[] numberes; // 记录二维数组中每个数组内的个数
int bit; // 每次取余得到的数
int index; // 排序数组的索引
int flag = 0; // 如果是排个位
int num = 1;
while(flag < maxBit){
if(flag == 0)
num = 1;
else
num = num * 10;
numberes = new int[10];
for(int i = 0;i < array.length;i ++){
// 拿到每个数的位
bit = (array[i] / num) % 10; // 取余
// 添加到二维数组中
arrays[bit][numberes[bit]] = array[i];
// 个数加1
numberes[bit] ++;
}
// 得到的新数组
index = 0;
for(int i = 0;i < 10;i ++){
for(int j = 0;j < numberes[i];j ++){
array[index] = arrays[i][j];
index ++;
}
}
System.out.println("第"+ flag + "次排序:");
for(int i = 0;i < array.length;i ++){
System.out.print(array[i] + " ");
}
System.out.println();
flag ++;
}
return array;
}
}
测试类
// 测试类
public class Demo {
public static void main(String[] args) {
int[] array = new int[]{
99,4,0,123,567,890,1439,1374};
RadixSort sort = new RadixSort();
array = sort.sort(array);
System.out.println("排好序的数组:");
for(int i : array){
System.out.print(i + " ");
}
}
}
结果
最大值的位数:4
第0次排序:
0 890 123 4 1374 567 99 1439
第1次排序:
0 4 123 1439 567 1374 890 99
第2次排序:
0 4 99 123 1374 1439 567 890
第3次排序:
0 4 99 123 567 890 1374 1439
排好序的数组:
0 4 99 123 567 890 1374 1439