计数排序

来源:互联网 发布:淘宝敲诈应对技巧 编辑:程序博客网 时间:2024/06/11 02:33

计数排序假设n个输入元素中的每一个都是在0-k区间内的一个整数,其中k为某个整数。


通过一个临时数组C[0..k]存储0-k排序后的准确位置,然后直接通过索引就能获得值排序后的准确位置。


代码如下:

import java.util.Arrays;public class CountingSort {public static void main(String[] args) {int[] arr = new int[(int)(Math.random()*50)];for(int i=0;i<arr.length;i++){arr[i] = (int)(Math.random()*50);}sort(arr,50);System.out.println(Arrays.toString(arr));}public static void sort(int[] A,int k){int[] B = new int[A.length];countingSort(A,B,k);for(int i=0;i<A.length;i++)A[i] = B[i];}//对值的范围是0-k的数组进行计数排序public static void countingSort(int[] A,int[] B,int k){int[] C = new int[k+1];for(int i=0;i<A.length;i++) C[A[i]]++;//此时的C[i]表示数组含有值i的个数for(int i=1;i<=k;i++)C[i] += C[i-1];//此时的C[i]表示数组含有值小于等于i的个数,可以通过索引C数组获得i排序后的准确位置for(int i=B.length-1;i>=0;i--){B[C[A[i]]-1] = A[i];//将A[i]放到B正确的位置上C[A[i]]--;}}}
countingSort的时间复杂度为O(n+k),当k=O(n)时,时间复杂度为O(n)

原创粉丝点击