JAVA实现计数排序

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

(一)、遍历原数组array,以原数组的元素值作为计数数组count的下标,每遇到一个元素就count[array[i]]++。

(二)、①排序不稳定的操作:对array数组遍历,新建一个数组newArray存储排序后的元素(大小是array.length)。

           ②排序稳定的操作:对count数组遍历构造累加数组,累加数组的每一个元素既表示了指定array元素中在排序后的最后一个位置,所以对array倒序遍历...

                                        其是排序稳定的原因就是在(一)步中的时候是顺序遍历,而现在排序则是倒序遍历,那么就是说前(加入count数组)后(从count数组取值依次倒序放进新数组)都有了顺序,自然也就是稳定的排序了。

(三)、代码实现

public static void main(String[] args){
int[] array = {91,92,95,96,95,90};
// int[] array = {421,240,115,532,305,430,124};
sort(array);
sortPlus(array);
}
public static void sort(int[] array){
int size = array.length;
int[] newArray = new int[size];
// 求出最大值最小值,以步长去计数登记在count数组中,避免
// 最小值并非0的情况造成<min部分的空间浪费
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i=0;i<size;i++){
max = Math.max(max,array[i]);
min = Math.min(min,array[i]);
}
// 构造count数组,长度为max-min+1,比如max-min=98-90=8,需要9个空间大小的才能容纳
int[] count = new int[max-min+1];
// 遍历array,登记count
for (int i=0;i<size;i++){
System.out.println("i = "+i);
count[array[i]-min]++;
}
// 此时count数组中已经登记了(从最小到最大)对应array数组中元素出现过的次数
// 对array循环遍历
int k=0;
for(int i=0;i<count.length;i++){
// 对count数组的每一位置的元素统计还原
while (count[i]>0){
// i+min就是还原元素值...因为前面的步骤是array[i]-min赋值到对应下标的count数组,自然直接i+min就可以找回元素
newArray[k++]=i+min;
count[i]--;
}
}
print(newArray,"最终结果");
}
public static void sortPlus(int[] array){
int size = array.length;
int[] newArray = new int[size];
// 求出最大值最小值,以步长去计数登记在count数组中,避免
// 最小值并非0的情况造成<min部分的空间浪费
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;

for (int i=0;i<size;i++){
max = Math.max(max,array[i]);
min = Math.min(min,array[i]);
}
// 构造count数组,长度为max-min+1,比如max-min=98-90=8,需要9个空间大小的才能容纳
int[] count = new int[max-min+1];
System.out.println("count大小="+count.length);
// 遍历array,登记count
for (int i=0;i<size;i++){
System.out.println("i = "+i);
count[array[i]-min]++;
}
print(count,"count数组");
// 开始累加数组
for (int i=1;i<count.length;i++){
count[i] = count[i]+count[i-1];
}
// 然后倒序遍历
for (int i=size-1;i>=0;i--){
// count[array[i]-min]表示该元素是最后第n位
newArray[count[array[i]-min]-1] = array[i];
count[array[i]-min]--;
}
print(newArray,"");
}
public static void print(int[] array,String str){
System.out.println(str);
for (int i:array){
System.out.print(i+" ");
}
System.out.println();
}
posted @ 2022-03-12 23:58  卓不庭  阅读(572)  评论(0)    收藏  举报