利用堆排序原理,在不对原数组进行排序的情况,如何统计出相邻元素的最大差值。
//无序数组中元素间的最大相邻差
//借助桶排序,实现求一个数组中两个相邻元素的最大相邻差。
public class MaxDistance {
public static int getMaxSortedDistance(int[] array) {
//获得当前无序数组的最大和最小值
int max=array[0];
int min=array[0];
for(int i=0; i<array.length; i++) {
if(array[i]>max) {
max=array[i];
}
if(array[i]<min) {
min=array[i];
}
}
//原数组的最大与最小值的差,为后续的桶的下标计算做准备。
int d=max-min;
//原数组中最大与最小值的差为零的话,说明数组中的所有元素都相等,我们所求即为零。
if(d==0) {
return 0;
}
//初始化桶,根据原数组的长度计算桶的数量。
int bucketnum=array.length;
Bucket[] buckets=new Bucket[bucketnum];
for(int i=0; i<bucketnum; i++) {
buckets[i]=new Bucket();
}
//将原数组中的元素对应到相应的桶下标index里,同时求出每个桶的最大和最小值。
for(int i=0; i<array.length; i++) {
//根据数据元素的下标,计算出相对应的桶下标。
int index=(array[i]-min)*(bucketnum-1)/d;
if(buckets[index].min==null || buckets[index].min>array[i]) {
buckets[index].min=array[i];
}
if(buckets[index].max==null || buckets[index].max<array[i]) {
buckets[index].max=array[i];
}
}
//找到桶数组中的两个相邻非空桶中的最大差值--->右侧桶的最小值-左侧桶的最大值,即为本题所求。
int leftMax=buckets[0].max;
int maxDistance=0;
for(int i=1; i<buckets.length; i++) {
if(buckets[i].min==null) {
continue;
}
if(buckets[i].min-leftMax > maxDistance) {
//计算相邻桶的最大差值
maxDistance=buckets[i].min-leftMax;
}
leftMax=buckets[i].max;
}
return maxDistance;
}
//桶类
private static class Bucket{
Integer max;//桶里的最大值
Integer min;//桶里的最小值
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = new int[] {2,20,13,18,5,10,9};
System.out.println(getMaxSortedDistance(array));
}
}