算法学习记录——无序数组中的最大相邻元素差值(JAVA实现)

 利用堆排序原理,在不对原数组进行排序的情况,如何统计出相邻元素的最大差值。

//无序数组中元素间的最大相邻差
//借助桶排序,实现求一个数组中两个相邻元素的最大相邻差。

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));
	}

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值