zoukankan      html  css  js  c++  java
  • 数据结构之排序算法Java实现(8)—— 线性排序之计数排序算法

    计数排序是线性排序。

    升序排序:

    public  void sortByAsc(int[] data) {
    		if(data == null || data.length <= 1)
    			return;
    		/** find the range of data */
    		int range = data[0];
    		for(int i = 1; i< data.length; i++){
    			if(range < data[i]){
    				range = data[i];
    			}
    		}
    		 if (range <= 0) {  
    			 System.out.println("边界不能为负数");
                 return; 
             }  
    		/** count sort */
    		countSortByAsc(data,range);
    		
    	}
    
    	private void countSortByAsc(int[] data, int range) {
    		
    		/**建一个长度为range+1的的数组countArray,里面的每一个元素初始都置为0(Java里面默认就是0)。*/
    		int[] countArray = new int[range + 1];
    		/**遍历待排序的数组,计算其中的每一个元素出现的次数,比如一个key为i的元素出现了3次,那么countArray[i]=3。*/
    		for(int i = 0;i < data.length; i++){
    			int val = data[i];
    			if(val < 0 || val > range){
    				System.out.println("下标超界");
    	             return;
    			}
    			countArray[val] += 1;
    		}
    		for(int i = 0,index = 0;i < countArray.length ; i++){
    			for(int j = 0; j <countArray[i];j++ ){
    					data[index] = i;
    					index++;
    			}
    
    		}
    		
    	}
    

      降序排序:

    public  void sortByDesc(int[] data) {
    		if(data == null || data.length <= 1)
    			return;
    		/** find the range of data */
    		int range = data[0];
    		for(int i = 1; i< data.length; i++){
    			if(range < data[i]){
    				range = data[i];
    			}
    		}
    		 if (range <= 0) {  
    			 System.out.println("边界不能为负数");
                 return; 
             }  
    		/** count sort */
    		countSortByDesc(data,range);
    		
    	}
    
    	private void countSortByDesc(int[] data, int range) {
    		/**建一个长度为range+1的的数组countArray,里面的每一个元素初始都置为0(Java里面默认就是0)。*/
    		int[] countArray = new int[range + 1];
    		/**遍历待排序的数组,计算其中的每一个元素出现的次数,比如一个key为i的元素出现了3次,那么countArray[i]=3。*/
    		for(int i = 0;i < data.length; i++){
    			int val = data[i];
    			if(val < 0 || val > range){
    				System.out.println("下标超界");
    	             return;
    			}
    			countArray[val] += 1;
    		}
    		for(int i = countArray.length - 1,index = 0;i >=0 ; i--){
    			for(int j = 0; j <countArray[i];j++ ){
    					data[index] = i;
    					index++;
    			}
    
    		}
    		
    	}
    

      

  • 相关阅读:
    wtforms
    day 036 线程 -创建,守护线程
    day 035 管道 和数据共享
    day034 锁,信号量,事件,队列,子进程与子进程通信,生产者消费者模型,joinableQueue
    day33 创建进程的方法和相关操作
    day 32并行 并发
    day 31 socketserver 和ftp打印进度条
    day 029 缓冲区和粘包 day 30 粘包的解决
    相关英语简称
    【实战】初识ListView及提高效率
  • 原文地址:https://www.cnblogs.com/Gabby/p/6523148.html
Copyright © 2011-2022 走看看