java面經查缺補漏之四十天(今天來補充幾個算法計數排序,桶排序)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章