计数排序
计数排序是基于非比较的一种排序,效率高,但是需要额外的内存空间,适用于 数量比比较小,而且对元素最大值也有限制。
代码流程如下:假设原数组名称为a
1.计算出数组当中最大的值,比如maxv
2.申请一个用于计数的数组c,数组大小为maxv
3.统计各个元素出现的个数c[a[i]]++
4.使用c[i]=c[i-1]+c[i]统计出小于等于i的元素个数。
5.申请一个记录结果的数组b,使用b[c[a[i]]]记录排序结果,c[a[i]]--
排序的时间复杂度在maxv*k因此非常快,但是这是以牺牲存储空间为代价的。
具体的java代码如下:
import java.io.*; public class Main { public static void main(String[] args) throws IOException { String str =null; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while((str = reader.readLine())!=null){ String []tmps = str.split(" "); int n = tmps.length; int nums[]=new int[n]; int maxv=-1; for(int i=0;i<n;i++){ nums[i]=Integer.valueOf(tmps[i]); if(maxv<nums[i])maxv=nums[i]; } int []c =new int[maxv+1];//c 数组要从1开始 for(int i=1;i<=maxv;i++){ c[i]=0; } for(int i=0;i<n;i++){ c[nums[i]]++; } for(int i=2;i<=maxv;i++){ c[i]=c[i]+c[i-1]; } int []b =new int[n+1]; for(int i=0;i<n;i++){ b[c[nums[i]]]=nums[i]; c[nums[i]]--; } outPut(n, b); } } private static void outPut(int n, int[] b) { for(int i=1;i<=n;i++){ System.out.print(b[i]+" "); }System.out.println(); } }