计数排序(Counting Sort)的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须有确定范围的整数。计数排序是一种稳定的排序算法,它使用一个额外的数组,其中第i个元素是待排序数组中值减去最小值等于i的元素的个数。然后根据额外数组重新分配给待排序的数组,它只能对整数进行排序。

算法描述:

1,找出待排序的数组中最大值和最小值。

2,统计数组中每个值为(i+min)的元素出现的次数,存入额外数组的第i项。

3,将额外的数组的值填充到目标数组。

动图演示:

代码实现:

public class Sort{
    public static void printArr(int[] arr){
         for(int i:arr){
             System.out.print(i+" ");
         }
    }

    public static void countingSort(int[] arr){
         if(arr==null||arr.length==0){
             return;
         }
         //找出目标数组中的最大值和最小值
         int min=arr[0],max=arr[0];
         for(int i:arr){
              if(min>i){
                  min=i;
              }
              if(max<i){
                  max=i;
              }
         }
         //len表示新数组的长度
         int len=max-min+1;
         int[] temp=new int[len];
         //统计值为arr[i]在目标数组的个数,并记录在新数组中。
         for(int i=0;i<arr.length;i++){
              temp[arr[i]-min]++;
         }
         //将新数组的值,重新分配给目标数组。
         int m=0;
         for(int j=0;j<temp.length;j++){
              while(temp[j]!=0){
                  arr[m++]=j+min;
                  temp[j]--;
              }
         }
    }

    public static void main(String[] args){
         int[] arr=new int[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
         countingSort(arr);
         printArr(arr);
    }
}

 

 posted on 2018-07-26 09:33  会飞的金鱼  阅读(154)  评论(0)    收藏  举报