您的位置:首页 > 其它

二分查找

2013-09-18 11:25 169 查看
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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: