二分查找

 1. 这里查找的数组是非降序的,数组array,待搜索元素data

  1) 在数组array中找出等于data的最小的元素下标;

  2) 在数组array中找出等于data的最大的元素下标

  3) 在数组array中找出大于data的最小的元素小标

 

   参考:《编程之美》


  代码如下:

/** 二分查找
 *  @author MWD
 *  2013-9-18
 */

public class biSearch {
	/**
	 * 在有序数组array中,找到值等于data的最大元素小标
	 * @param array 非降序数组
	 * @param data  待搜索元素
	 * @return 找到就返回最大的元素下标,找不到就返回-1
	 */
	private int maxIndexOfEqual(int[] array,int data){
		int minIndex = 0;
		int maxIndex = array.length-1;
		
		while(minIndex < maxIndex-1){
			int midIndex = minIndex+(maxIndex-minIndex)/2;
			
			//把搜索到的==data的当做小于data处理,所以要继续往右边搜索,
			//即坐边界继续往右移动
			if(array[midIndex] <= data)
				minIndex = midIndex;
			else
				maxIndex = midIndex;
		}
		
		if(array[maxIndex] == data)
			return maxIndex;
		else if(array[minIndex] == data)
			return minIndex;
		else
			return -1;
	}
	
	/**
	 * 在有序数组中array中,找到等于值等于data的最小下标元素
	 * @param array 非降序数组
	 * @param data  待搜索元素
	 * @return 找到返回最小的元素下标,找不到就返回-1
	 */
	private int minIndexOfEqual(int[] array,int data){
		int minIndex = 0;
		int maxIndex = array.length-1;
		
		while(minIndex < maxIndex-1){
			int midIndex = minIndex+(maxIndex-minIndex)/2;  //求取均值,可以防止溢出
			
			//欲搜索等于data的最小的下标,把等于data当做小于data处理
			//即要搜索到==data时要继续往左边搜索,即右边界要往左移动
			if(array[midIndex] >= data)
				maxIndex = midIndex;
			else
				minIndex = midIndex;
		}
		
		if(array[minIndex] == data)
			return minIndex;
		else if(array[maxIndex] == data)
			return maxIndex;
		else
			return -1;
	}
	
	/**
	 * 在有序数组中找到大于data的最小元素的下标
	 * @param array
	 * @param data
	 * @return
	 */
	private int minIndexOfBiggerThan(int[] array,int data){
		int minIndex = 0;
		int maxIndex = array.length-1;
		
		while(minIndex < maxIndex-1){
			int midIndex = minIndex + (maxIndex-minIndex)/2;
			
			if(array[midIndex] <= data)
				minIndex = midIndex;
			else
				maxIndex = midIndex;
		}
		
		if(array[maxIndex] == data){
			if(maxIndex < array.length-1)
				return maxIndex+1;
			else
				return -1;
		}
		//可能待搜索的元素大于数组中的所有元素
		else if(array[maxIndex] < data)
			return -1;
		else
			return maxIndex;
			
			
	}
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args){
		int[] array = {1,1,2,3,4,5,6,6,7,8};   
		
		biSearch bi = new biSearch();
		System.out.println("搜索元素1,最小下标为:"+bi.minIndexOfEqual(array, 1));
		System.out.println("搜索元素1,最大下标为:"+bi.maxIndexOfEqual(array, 1));
		System.out.println("搜索大于6,最小下标为:"+bi.minIndexOfBiggerThan(array, 16));
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值