• 数据结构之排序算法Java实现(9)—— 线性排序之 基数排序算法


    基数排序算法是计数排序的延伸,计数排序会造成很大的空间浪费,但基数排序法是对位数进行排序,适合于位数之间相差较大的情况,废话不多说,直接上代码:

    升序排序法:

    /**
    	 * 基数排序法
    	 * 升序排列
    	 * @param data
    	 */
    	public  void sortByAsc(int[] data) {
    		if(data == null || data.length <= 1){
    			return;
    		}
    
    		/** step1:确定排序的趟数*/     
    		int max=data[0];     
    		for(int i=1;i<data.length;i++){     
    			if(data[i]>max){     
    				max=data[i];     
    			}     
    
    		}   
    		/** step2:判断位数*/
    		int digit = 0;       
    		while(max > 0){     
    			max/=10;     
    			digit++;     
    		}  
    		/**初始化一个二维数组,相当于二维数组,可以把重复的存进去*/
    		List<ArrayList<Integer>> temp = new ArrayList<>();
    		for(int i = 0;i < 10;i++){
    			temp.add(new ArrayList<Integer>());
    		}
    		/**开始合并收集*/
    		for(int i = 0; i < digit; i++){
    			/** 对每一位进行排序 */
    			for(int j = 0; j < data.length; j++){
    				/**求每一个数的第i位的数,然后存到相对应的数组中*/
    				int digitInx = data[j]%(int)Math.pow(10, i + 1)/(int)Math.pow(10, i);
    				ArrayList<Integer> tempInside = temp.get(digitInx);
    				tempInside.add(data[j]);
    				temp.set(digitInx,tempInside );
    			}
    			/**收集数组元素*/
    			int count = 0;
    			for(int k = 0;k < 10;k++){
    				for(;temp.get(k).size()>0;count++){
    					ArrayList<Integer> temp2 = temp.get(k);
    					data[count] = temp2.get(0);
    					temp2.remove(0);
    				}
    			}
    		}
    		
    	}    
    

      降序排序:

    /**
    	 * 基数排序法
    	 * 降序排列
    	 * @param data
    	 */
    	public  void sortByDesc(int[] data) {
    		if(data == null || data.length <= 1){
    			return;
    		}
    
    		/** step1:确定排序的趟数*/     
    		int max=data[0];     
    		for(int i=1;i<data.length;i++){     
    			if(data[i]>max){     
    				max=data[i];     
    			}     
    
    		}   
    		/** step2:判断位数*/
    		int digit = 0;       
    		while(max > 0){     
    			max/=10;     
    			digit++;     
    		}  
    		/**初始化一个二维数组,相当于二维数组,可以把重复的存进去*/
    		List<ArrayList<Integer>> temp = new ArrayList<>();
    		for(int i = 0;i < 10;i++){
    			temp.add(new ArrayList<Integer>());
    		}
    		/**开始合并收集*/
    		for(int i = 0; i < digit; i++){
    			/** 对每一位进行排序 */
    			for(int j = 0; j < data.length; j++){
    				/**求每一个数的第i位的数,然后存到相对应的数组中*/
    				int digitInx = data[j]%(int)Math.pow(10, i + 1)/(int)Math.pow(10, i);
    				ArrayList<Integer> tempInside = temp.get(digitInx);
    				tempInside.add(data[j]);
    				temp.set(digitInx,tempInside );
    			}
    			int count = data.length - 1;
    			for(int k = 0;k < 10;k++){
    				for(;temp.get(k).size()>0;count--){
    					ArrayList<Integer> temp2 = temp.get(k);
    					data[count] = temp2.get(0);
    					temp2.remove(0);
    				}
    			}
    		}
    	}
    	
    

      

  • 相关阅读:
    IIS发布问题解决
    创建Core项目使用IdentityServer4
    通过数据库名称字符串 反射获取数据并刷新对应缓存
    MVC模式下unity配置,报错“No connection string named '**Context' could be found in the application config file”
    Docker巨轮的航行之路-基础知识篇
    C#之LINQ
    Js调试中不得不知的Console
    jQuery中是事件绑定方式--on、bind、live、delegate
    前端常用技术概述--Less、typescript与webpack
    ES6学习之变量的解构赋值
  • 原文地址:https://www.cnblogs.com/Gabby/p/6524425.html
Copyright © 2020-2023  润新知