zoukankan      html  css  js  c++  java
  • 计数排序

    计数排序是基于非比较的一种排序,效率高,但是需要额外的内存空间,适用于 数量比比较小,而且对元素最大值也有限制。

    代码流程如下:假设原数组名称为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();
    	}
    
    }
    
  • 相关阅读:
    CoreLocation
    通知(NSNotificationCenter)
    加载xib文件
    UITextField
    UIButton
    UILabel
    UIAlertController
    layoutSubviews
    Java AQS详解(转)
    Java中synchronized
  • 原文地址:https://www.cnblogs.com/jackwuyongxing/p/3764162.html
Copyright © 2011-2022 走看看