计数排序(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
浙公网安备 33010602011771号