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