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

    桶排序算法也是线性排序的一种,它是根据数据的最大值和最小值来确定桶的大小,桶内如果有多个元素,还用使用快排进行内部排序,代码如下:

    升序排序:

    /**
    	 * 桶排序
    	 * 升序排序
    	 * @param data
    	 */
    	public  void sortByAsc(int[] data) {
    		if(data == null || data.length <= 1){
    			return;
    		}
    		/**Step1:获取最大值和最小值*/
    		int minData = data[0];
    		int maxData = data[1];
    		for(int i = 1; i < data.length; i++){
    			if(minData > data[i]){
    				minData = data[i];
    			}
    			if(maxData < data[i]){
    				maxData = data[i];
    			}
    		}
    		/**Step2:初始化桶*/
    		List<ArrayList<Integer>> bucket = new ArrayList<>();
    		int bucketSize = (maxData - minData)/data.length  + 1;
    		for(int i = 0;i < bucketSize; i++){
    			bucket.add(new ArrayList<Integer>());
    		}
    		/**Step3:将data中的数放入到相应的桶中*/
    		for(int i = 0; i < data.length; i++){
    			int num = (data[i] - minData) / data.length;
    			bucket.get(num).add(data[i]);
    		}
    		/**Step4:对同一个桶中的数进行内部排序,其实应该用快排,我这里用的是JDK8里面的集合排序
    		 * Collections.sort()其实用的是合并排序*/
    		for(int i = 0;i < bucket.size();i++){
    			Collections.sort((bucket.get(i)));
    		}
    		/**step5:收集数组元素*/
    		int count = 0;
    		for(int k = 0;k < bucket.size();k++){
    			for(;bucket.get(k).size()>0;count++){
    				ArrayList<Integer> temp2 = bucket.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 minData = data[0];
    		int maxData = data[1];
    		for(int i = 1; i < data.length; i++){
    			if(minData > data[i]){
    				minData = data[i];
    			}
    			if(maxData < data[i]){
    				maxData = data[i];
    			}
    		}
    		/**Step2:初始化桶*/
    		List<ArrayList<Integer>> bucket = new ArrayList<>();
    		int bucketSize = (maxData - minData)/data.length  + 1;
    		for(int i = 0;i < bucketSize; i++){
    			bucket.add(new ArrayList<Integer>());
    		}
    		/**Step3:将data中的数放入到相应的桶中*/
    		for(int i = 0; i < data.length; i++){
    			int num = (data[i] - minData) / data.length;
    			bucket.get(num).add(data[i]);
    		}
    		/**Step4:对同一个桶中的数进行内部排序,其实应该用快排,我这里用的是JDK8里面的集合排序
    		 * Collections.sort()其实用的是合并排序*/
    		for(int i = 0;i < bucket.size();i++){
    			Collections.reverse(bucket.get(i));
    		}
    		/**收集数组元素*/
    		int count = data.length - 1;
    		for(int k = 0;k < bucket.size();k++){
    			for(;bucket.get(k).size()>0;count--){
    				ArrayList<Integer> temp2 = bucket.get(k);
    				data[count] = temp2.get(0);
    				temp2.remove(0);
    			}
    		}
    	}
    

      

  • 相关阅读:
    SQL语句之奇形怪状的冷门函数
    计算累计收益
    关于SQL表字段值缺失的处理办法
    虚拟机移植到另一台机器
    分分钟搞懂rank() over(partition by)的使用
    分分钟搞懂union与union all
    【转】10分钟就能学会的.NET Core配置
    【转】依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题
    【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
    【转】在.net Core 中像以前那样的使用HttpContext.Current
  • 原文地址:https://www.cnblogs.com/Gabby/p/6524730.html
Copyright © 2011-2022 走看看