1.計數排序(桶排序的特殊情況,只是每個桶只有一個數)
用於那些數字比較集中的,並且在一定範圍內的,其實就是用hash數組先記錄一下次數而已
public static void jishusort(int[] array)
{
int max=Integer.MIN_VALUE;
int min=Integer.MAX_VALUE;
for(int x:array)
{
max=Math.max(max,x);
min=Math.min(min,x);
}
int[] count=new int[max-min+1];
for(int x:array)
{
count[x-min]++;
}
int index=0;
for(int i=0;i<count.length;i++)
{
while(count[i]>0)
{
array[index]=i+min;
index++;
count[i]--;
}
}
}
2.桶排序
桶排序可用於最大最小值相差較大的數據情況,把數組 arr 劃分爲n個大小相同子區間(桶),每個子區間各自排序,最後合併。
public static void bucketSort(int[] arr){
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i = 0; i < arr.length; i++){
max = Math.max(max, arr[i]);
min = Math.min(min, arr[i]);
}
//桶數
int bucketNum = (max - min) / arr.length + 1;
ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
for(int i = 0; i < bucketNum; i++){
bucketArr.add(new ArrayList<Integer>());
}
//將每個元素放入桶
for(int i = 0; i < arr.length; i++){
int num = (arr[i] - min) / (arr.length);
bucketArr.get(num).add(arr[i]);
}
//對每個桶進行排序
for(int i = 0; i < bucketArr.size(); i++){
Collections.sort(bucketArr.get(i));
}
System.out.println(bucketArr.toString());
}