二分搜寻法
class BinaryTest{
public static void main(String[] args) {
int[] arr ={1,2,3,4,5,6,7,8};
//i:数组元素的值
for (int i = 1; i <= arr.length; i++) {
System.out.println("indexAsc "+i+" = "+binaryAsc(arr,i));
}
System.out.println("----------------" );
int[] arr2 ={7,6,5,4,3,2,1};
//i:数组元素的值
for (int i = arr2.length; i >= 1 ; i--) {
System.out.println("indexDesc "+i+" = "+binaryDesc(arr2,i));
}
/*输出结果: indexAsc 1 = 0
indexAsc 2 = 1
indexAsc 3 = 2
indexAsc 4 = 3
indexAsc 5 = 4
indexAsc 6 = 5
indexAsc 7 = 6
indexAsc 8 = 7
----------------
indexDesc 7 = 0
indexDesc 6 = 1
indexDesc 5 = 2
indexDesc 4 = 3
indexDesc 3 = 4
indexDesc 2 = 5
indexDesc 1 = 6 */
}
/**
*
* @param arr int类型数组
* @param search 需要查找的元素
* @return 可以查询到就返回该元素的下标,查不到就返回-1
* binaryAsc方法:用来处理升序排列的数组的元素二分查找
* binaryDesc方法:用来处理降序排列的数组的元素二分查找
* minIndex:最小下标 maxIndex:最大下标 midIndex:中间下标
* 1.思想(升序排列二分法):
* 如果被查找元素值大于中间值:最小下标=中间下标+1,等于中间值返回中间下标,小于中间值:最大下标=中间下标-1,以达到缩小范围的效果
* 2.思想(降序排列二分法):
* 与升序排列二分法思想相反
*/
public static int binaryAsc(int[] arr,int search){
if (arr==null || arr.length==0) return -1;
int maxIndex = arr.length-1;
int minIndex = 0;
while (minIndex <= maxIndex){
int midIndex = (maxIndex + minIndex)/2;
if (search > arr[midIndex]) minIndex = midIndex + 1;
if (search == arr[midIndex]) return midIndex;
if (search < arr[midIndex]) maxIndex = midIndex - 1;
}
return -1;
}
public static int binaryDesc(int[] arr,int search){
if (arr==null || arr.length==0) return -1;
int maxIndex = arr.length-1;
int minIndex = 0;
while(minIndex <= maxIndex){
int midIndex = (maxIndex + minIndex)/2;
if (search > arr[midIndex]) maxIndex = midIndex - 1;
if (search == arr[midIndex]) return midIndex;
if (search < arr[midIndex]) minIndex = midIndex + 1;
}
return -1;
}
}