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

浙公网安备 33010602011771号