package com.zyx.Class2;
二分查询 应用于 有序数组。
若数组有序,使用二分查询
二分查询的变种:
如果 一个数组是: arr[] = {1,1,1,1,1,3,5,7,9,11,13,15,15,15,16};
// 找出指定值 第一次出现的位置。
/*
解决方法:
在找到后,加一个while循环,while(arr[middle-1] == arr[middle] ){ middle—; }
*/
public class MiddleSort {
// 二分查询的非递归实现
public static int binarySearchSort(int[] arr, int val) {
int left = 0;
int right = arr.length - 1;
int middle = 0;
while (left <= right) { // 为什么不是 left < right ?
// left和right指向同一个位置,这个区域还有一个值,这个值 我们还没有进行比较。
middle = (right + left) / 2; // (right-left) >>1 + left;
if (arr[middle] < val) {
left = middle + 1;
} else if (arr[middle] > val) {
right = middle - 1;
} else {
return middle;
}
}
return -1;
}
// 二分查询的递归实现
public static int binSearch(int arr[], int left, int right, int val) {
if (left <= right) {
int middle = (left + right) / 2;
if (arr[middle] > val) {
return binSearch(arr, 0, middle - 1, val);
} else if (arr[middle] < val) {
return binSearch(arr, middle + 1, arr.length - 1, val);
} else {
while (middle > left && arr[middle - 1] == val) {
middle—;
}
return middle;
}
}
return -1;
}
public static void main (String[]args){
int arr[] = new int[]{0, 1, 1, 1, 5, 7, 9, 11, 11, 11, 11, 13, 14};
System.out.println(binarySearchSort(arr, 7));
System.out.println(binSearch(arr, 0, arr.length - 1, 11));
}
}
