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));
}
}