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

      

  • 相关阅读:
    Linux GCC
    操作系统中的一些数据结构
    《C程序设计》指针部分学习记录-易混点
    操作系统原理与实践-试验2操作系统的引导记录
    输入字符串测试
    实模式和保护模式
    Unity周记: 2020.07.06-07.12
    Unity论坛问答-如何裁剪一个多边形
    Unity论坛问答-如何让Camera.ScreenToWroldPoint在XZ平面上移动
    Unity杂谈-SRP为什么不再使用CG
  • 原文地址:https://www.cnblogs.com/Gabby/p/6524730.html
Copyright © 2020-2023  润新知