工程上用得不多,主要原因是得知道数据范围。最主要的意义在于,有利于发挥计算机的存储性。
/**
* 〈一句话功能简述〉<br>
* 〈桶排序,基于计数的桶〉
*
* @author Administrator
* @create 2019/5/25
* @since 1.0.0
*/
public class BucketSort {
public static void bucketSort(int[] arr) {
if (arr == null || arr.length < 2) return;
int max = Integer.MIN_VALUE;
for (int i = 0; i < arr.length; i++) {
max = Math.max(max , arr[i]);//找出最大的数,以此确定桶的个数
}
int[] bucket = new int[max + 1];//建立max+1个桶
for (int i = 0; i < arr.length; i++) {
bucket[arr[i]]++;//将数放入相应序号的桶中,并统计个数。
}
//将相同序号的桶,按个数倒出来
int i=0;
for (int j = 0; j < bucket.length; j++) {
while (bucket[j]-- > 0){
arr[i++]=j;
}
}
}
很锻练自己coding能力的一个练习,值得深究,即如何用计算机优势实现物理动作的过程。查找最大值,时间和空间复杂度都为O(n)
/**
* 〈一句话功能简述〉<br>
* 〈排序后最大差值查找〉
*
* @author Administrator
* @create 2019/5/28
* @since 1.0.0
*/
public class MaxGap {
public static int maxGap(int[] arr) {
if (arr == null || arr.length < 2) return 0;
int len = arr.length;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
max = Math.max(max , arr[i]);
min = Math.min(min , arr[i]);//找出数组里的最大数与最小数
}
if (max == min) return 0;
//这里是有数组里有N个数,那么分配N+1个桶这与基于基数的桶排序(按照最大数max作为分配桶的个数)是不同的
boolean[] hasNum = new boolean[len + 1];//这个桶进没进数的标志
int[] maxs = new int[len + 1];//记录每个桶里面的最大数
int[] mins = new int[len + 1];
int serialNum;//桶编号 以下是,找一个桶编号下对应的最大值与最小值
for (int i = 0; i < len; i++) {
serialNum = bucket(arr[i] , len , max , min);
maxs[serialNum] = hasNum[serialNum] ? Math.max(maxs[serialNum] , arr[i]) : arr[i];//依次找出数组中此桶号的最大值与最小值
mins[serialNum] = hasNum[serialNum] ? Math.min(mins[serialNum] , arr[i]) : arr[i];
hasNum[serialNum] = true;
}
//求最大差值,基本思路就是求前一个桶的最大值与后一个桶的最小值,最大差值必在其中
int res = 0;//记录最大差值
int lastmax = maxs[0];//第一桶的最大值
for (int i = 1; i <= len; i++) {
if (hasNum[i]) {
res = Math.max(res , mins[i] - lastmax);
lastmax = maxs[i];
}
}
return res;
}
public static int bucket(long num , long len , long max , long min) {
return (int) ((num - min) * len / (max - min));//此处正是此问题的逻辑,这体现了算法的本质是数学问题,如何求某数放到哪个桶号的桶中呢?
//桶号/桶的总个数与(num-min)/(max-min)
}
public static int[] generaterRodomArray(int maxSize , int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];//创建一个从0到maxSize+1
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random());
}
return arr;
}
public static void printArr(int[] arr) {
if (arr == null) return;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int maxvalue = 100;
int maxsize = 100;
int resNum;
int[] arr = generaterRodomArray(maxsize , maxvalue);
printArr(arr);
resNum = maxGap(arr);
System.out.println(resNum);
}
}