需求:
对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示‘’没有这个数‘’
思路:
代码:
package cn.itjy.search;
import java.util.ArrayList;
import org.w3c.dom.ls.LSException;
/**
* 二分查找
*
* @author 86183
*
*/
public class BinarySearch {
public static void main(String[] args) {
// 二分数组的前提是,该数组是有序的
int[] arr = { 1, 8, 10, 89, 1000,1000, 1234 };
System.out.println(binarySearch2(arr, 0, arr.length - 1, 1000));
}
/**
*
* @param arr
* 数组
* @param left
* 左边的索引
* @param right
* 右边的索引
* @param finaVal
* 要查找的值
* @return 找到就返回下标,没有找到,就返回-1
*/
public static int binarySearch(int[] arr, int left, int right, int finaVal) {
// 当left > right 时,说明递归完毕,但是没有找到
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (finaVal > midValue) { // 向右递归
return binarySearch(arr, mid + 1, right, finaVal);
} else if (finaVal > midValue) {
return binarySearch(arr, left, mid + 1, finaVal);
} else {
return mid;
}
}
// 完成课后思考题
/*
* {1, 8, 10, 89, 1000,1000,1234} 有多个相同的数值时,如何将所有的数值查找到,比如1000 思路分析
* 1.在找到mid值,不要马上返回 2.向mid索引的左边扫描,将所有满足 1000的元素的下标,加入到一个集合中ArrayList
* 3.向mid索引值的右边扫描,将所有满足 1000的元素的下标,加入到一个集合中ArrayList 4.将array返回就可以了
*/
public static ArrayList binarySearch2(int[] arr, int left, int right, int finaVal) {
// 当left > right 时,说明递归完毕,但是没有找到
if (left > right) {
return null;
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (finaVal > midValue) { // 向右递归
return binarySearch2(arr, mid + 1, right, finaVal);
} else if (finaVal > midValue) {
return binarySearch2(arr, left, mid + 1, finaVal);
} else {
ArrayList<Integer> list = new ArrayList<Integer>();
int temp = mid - 1; // 左边
while (true) {
if (temp < 0 || arr[temp] != finaVal) { // 退出
break;
}
list.add(temp);
temp -= 1;
}
list.add(mid);
// 3.向mid索引值的右边扫描,将所有满足 1000的元素的下标,加入到一个集合中ArrayList
temp = mid + 1;
while (true) {
if (temp > arr.length-1 || arr[temp] != finaVal) { // 退出
break;
}
list.add(temp);
temp += 1;
}
return list;
}
}
}
总结:
实现起来还是比较简单的