package test1;
import java.util.Arrays;
public class CountSort {
/**
* 计数排序:
*/
public static void main(String[] args) {
int arr[] = new int[]{11,8,3,9,7,1,2,5};
System.out.println(Arrays.toString(arr));
countingSort(arr);
}
public static void countingSort(int[] array){
//求出待排序的数组中的最小值和最大值,找出取值区间
int max = array[0];
int min = array[0];
for(int i=0;i<array.length;i++){
if(array[i]>max){
max = array[i];
}
if(array[i]<min){
min = array[i];
}
}
//定义一个额外的数组
int buketSize = (max-min)+1;
int[] bucket = new int[buketSize];
//统计对应元素的个数
for(int i=0;i<array.length;i++){
int bucketIndex = array[i]-min;
bucket[bucketIndex]+=1;
}
//对数组中的元素进行累加操作
for (int i=1;i<bucket.length;i++){
bucket[i] = bucket[i]+bucket[i-1];
}
//创建一个临时的数组来存储最终的有序序列
int[] temp = new int[array.length];
//逆序扫描待排序的数组,可以保证元素的稳定性
for (int i=array.length-1;i>=0;i--){
int bucketIndex = array[i]-min;
temp[bucket[bucketIndex]-1] = array[i];
bucket[bucketIndex]-=1;
}
//将我们的临时数据,依次放入一个原始的数组中
for (int i=0;i<temp.length;i++){
array[i] = temp[i];
}
System.out.println(Arrays.toString(array));
}
}