• 数据结构之排序算法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);
    				}
    			}
    		}
    	}
    	
    

      

  • 相关阅读:
    精益创业和画布实战(2):皇包车和易途8,中文包车游世界
    精益创业和画布实战(2):皇包车和易途8,中文包车游世界
    互联网公司的技术体系
    互联网公司的技术体系
    Android开发——告诉你Adapter应该写在Activity里面还是外面
    Android开发——Android手机屏幕适配方案总结
    09-抽象工厂
    08-工厂方法
    07-简单工厂(不属于设计模式)
    06-开闭原则(OCP)
  • 原文地址:https://www.cnblogs.com/Gabby/p/6524425.html
Copyright © 2020-2023  润新知