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

  

原文地址:https://www.cnblogs.com/Gabby/p/6524730.html