排序算法---------计数排序

/**
 * 计数排序
 * 构建一个数组,存放从0到最大值中每个数的个数,然后依次遍历数据,将数据取出来。
 * @author Administrator
 *
 */

public class CountSort {

    public static void main(String[] args) {

        int[] arr = {1,2,3,1,2,34,5,6,3,3};
        int gap = getGap(arr);
        int[] countSort = countSort(arr,gap);
        for (int i : countSort) {
            System.out.print(i+"  ");

        }

    }
    /**
     * 
     * @param arr 需要排序的数组
     * @param gap 最大值和最小值之差,表示可能的元素个数
     */
    public static int[] countSort(int[] arr,int gap) {
        //创建一个数组
        int[] count = new int[gap+1];//计数
        int length = arr.length;
        int sum = 0;//获取A数组大小用于构造B数组  
        int[] B = new int[length];//构造B数组

        for(int i=0;i<length;i++)
        {
            count[arr[i]] += 1;// 统计A中各元素个数,存入count数组
        }
        for(int i=0;i<=gap;i++)//修改C数组
        {
            sum+=count[i];
            count[i]=sum;    
        }
        for(int i=length-1;i>=0;i--)//遍历arr数组,构造B数组
        {
            B[count[arr[i]]-1]=arr[i];//将A中该元素放到排序后数组B中指定的位置
            count[arr[i]]--;//将C中该元素-1,方便存放下一个同样大小的元素
        }
        return B;//将排序好的数组返回,完成排序
    }
    public static int getGap(int[] arr) {
        if(arr==null||arr.length==0) {
            return -1;
        }
        int max = arr[0];
        for(int i=1;i<arr.length;i++) {
            if (max<arr[i]) {
                max = arr[i];
            }
        }
        return max ;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_42061676/article/details/81093337