JAVA实现基数排序

            北京时间2022年03月12日,晚21:31分。天气晴朗,温度适中。广东(佛山)终于从2月的冷天气转为气候宜人的春天了,心情也大好。今天来实现JAVA基数排序,简单说下思路:

(一)、依次从最低位开始排序(使用计数排序)。

(二)、最低位至十位数排序...,最后至最大数最高位排序...

(三)、代码实现

public static void main(String[] args){
int[] array = {11,101,95,9,45,54};
// int[] array = {421,240,115,532,305,430,124};
int i = 95/10%10;
int k = (int)Math.pow(i,0);
System.out.println(i);
System.out.println(k);
sort(array);
sortPlus(array,findMaxNumHowManyDigit(array));
}
/**
* 思路:①先按个位数按计数排序
* ②再按百位数按计数排序
* ③.....
* ④最后按最大数的最高位排序
* @param array
*/
public static void sort(int[] array){
// 首先求个位数的,直接求 %10即可得出个位数排序
int size = array.length;
int[] newArray = new int[size];
// 记录的数组,数组固定长度为10,因为数字是0-9正好10个
int[] count = new int[10];
System.out.println("开始对个位排序");
for(int i=0;i<size;i++){
int singleDigit = array[i]/1%10;
count[singleDigit]++;
}
print(count);
// 然后使用计数排序
for (int i=1;i<count.length;i++){
count[i] = count[i]+count[i-1];
}
print(count);
for (int i=size-1;i>=0;i--){
// 这里为什么都要count[array[i]%10]-1?
newArray[count[array[i]%10]-1] = array[i];
count[array[i]%10]--;
}
print(newArray);
// 因为这时候newArray已经排好序了,所以需要对原数组array覆盖为当前newArray数组
changeOrigArray(array,newArray);
System.out.println("开始对10位排序");
count = new int[10];
// 然后对十位数排序
for(int i=0;i<size;i++){
int singleDigit = array[i]/10%10;
count[singleDigit]++;
}
print(count);
for (int i=1;i<count.length;i++){
count[i] = count[i]+count[i-1];
}
print(count);
for (int i=size-1;i>=0;i--){
// 这里为什么都要count[array[i]%10]-1?
newArray[count[array[i]/10%10]-1] = array[i];
count[array[i]/10%10]--;
}
print(newArray);
changeOrigArray(array,newArray);
System.out.println("开始对100位排序");
count = new int[10];
// 然后对十位数排序
for(int i=0;i<size;i++){
int singleDigit = array[i]/100%10;
count[singleDigit]++;
}
print(count);
for (int i=1;i<count.length;i++){
count[i] = count[i]+count[i-1];
}
print(count);
for (int i=size-1;i>=0;i--){
// 这里为什么都要count[array[i]%10]-1?
newArray[count[array[i]/100%10]-1] = array[i];
count[array[i]/100%10]--;
}
changeOrigArray(array,newArray);
print(array);
}

public static void sortPlus(int[] array,int k){
int n=1;
int size = array.length;
int[] newArray = new int[size];
// 记录的数组,数组固定长度为10,因为数字是0-9正好10个
for (int i=0;i<k;i++){
int[] count = new int[10];
for(int j=0;j<size;j++){
int singleDigit = array[j]/n%10;
count[singleDigit]++;
}
print(count);
for (int j=1;j<count.length;j++){
count[j] = count[j]+count[j-1];
}
print(count);
for (int j=size-1;j>=0;j--){
// 这里为什么都要count[array[i]%10]-1?
newArray[count[array[j]/n%10]-1] = array[j];
count[array[j]/n%10]--;
}
n *= 10;
print(newArray);
// 这里再对原数组赋值
changeOrigArray(array,newArray);
System.out.println("-------------");
}
}
public static int findMaxNumHowManyDigit(int[] array){
int result = 0;
int max = 0;
for (int i=0;i<array.length;i++){
max = Math.max(max,array[i]);
}
return (max+"").length();
}

public static void changeOrigArray(int[] orig,int[] newArray){
for (int i=0;i<newArray.length;i++){
orig[i]=newArray[i];
}
}
public static void print(int[] array){
for (int i:array){
System.out.print(i+" ");
}
System.out.println();
}
posted @ 2022-03-12 22:39  卓不庭  阅读(203)  评论(0)    收藏  举报