欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java面经查缺补漏之四十天(今天来补充几个算法计数排序,桶排序)

程序员文章站 2022-03-03 08:22:59
...

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