二分查找(递归)
/**
*
* @param arr 待查找的数组
* @param i 待查找的值
* @param left 数组的左边界
* @param right 数组的有边界
* @return
*/
public static List<Integer> binarySearch(int[] arr, int i, int left, int right) {
if (left >= right) {
//System.out.printf("left=%d,right=%d\n ", left, right);
return null;
}
int mid = (left + right) / 2;
int val = arr[mid];
if (i < val) {
return binarySearch(arr, i, left, mid - 1);
} else if (i > val) {
return binarySearch(arr, i, mid + 1, right);
} else {
List<Integer> list = new ArrayList<Integer>();
list.add(mid);
int temp = mid - 1, temp2 = mid + 1;
while (true) {
if (temp < 0 || arr[temp] != i)
break;
list.add(temp);
temp--;
}
while (true) {
if (temp2 > arr.length - 1 || arr[temp2] != i)
break;
list.add(temp2);
temp2++;
}
return list;
}
}
非递归二分查找
/**
*
* @param arr 待查找的顺序数组
* @param i 待查找的值
* @return
*/
public static List<Integer> binarySearch(int[] arr, int i) {
int left = 0;
int right = arr.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] == i) {
List<Integer> list = new ArrayList<Integer>();
list.add(mid);
int temp = mid - 1, temp2 = mid + 1;
while (true) {
if (temp < 0 || arr[temp] != i)
break;
list.add(temp);
temp--;
}
while (true) {
if (temp2 > arr.length - 1 || arr[temp2] != i)
break;
list.add(temp2);
temp2++;
}
return list;
} else if (arr[mid] < i) {
right = mid - 1;
} else if (arr[mid] > i) {
left = mid + 1;
} else {
return null;
}
}
return null;
}