- 二分查找的思路分析
- 1.首先确定改数组的中间下标
- mid = (left+right)/2;
- 2.然后让需要找到的数findVal和arr[mid]比较
- 2.1findVal>arr[mid] ,说明要查找的数在mid的右边,因此需要递归向右查找
- 2.2findVal<arr[mid],说明要查找的数在mid的左边,因此需要递归的向左查找
- 2.3findVal == arr[mid] 说明找到了就返回
什么时候结束递归
- 找到就结束递归
- 递归完整个数组,任然没有找到findVal,也需要结束递归,当left>right 就需要退出
*** 当有多个相同的数值时的处理**
* 思路分析:
* 1。在找到mid索引值,不要马上返回,
* 2.向mid索引的左边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
* 3.向mid索引的右边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
* 4.将ArrayList返回
*/
package com.hadwinling.search;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int [] arr1 = {1,9,11,34,89,100,100,121};
List<Integer> lists = binarySeearch2(arr1, 0, arr1.length-1, 100);
// System.out.println(lists.size());
if (lists.size()==0) {
System.out.println("该数组没有这个值");
}else {
System.out.println(lists);
}
}
//二分查找
/**
*
* @param arr 要查找的数组
* @param left 数组左边的索引
* @param right 数组右边的索引
* @param findVal 要查找的值
* @return 如果找到就返回下标,如果没有找到就返回-1
*/
public static int binarySeearch(int[]arr,int left,int right,int findVal) {
//当left>right时,说明递归整个数组,但是没有找到
if (left>right) {
return -1;
}
int mid = (left+right)/2;
int midVal = arr[mid];
if (findVal>midVal) {
//向右递归
return binarySeearch(arr, mid+1, right, findVal);
}else if (findVal<midVal) {
return binarySeearch(arr, left, mid-1, findVal);
}else {
return mid;
}
}
/*
* 当有多个相同的数值时的处理
*/
/*
* 思路分析:
* 1。在找到mid索引值,不要马上返回,
* 2.向mid索引的左边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
* 3.向mid索引的右边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
* 4.将ArrayList返回
*/
public static List<Integer> binarySeearch2(int[]arr,int left,int right,int findVal) {
//当left>right时,说明递归整个数组,但是没有找到
if (left>right) {
return new ArrayList<Integer>();
}
int mid = (left+right)/2;
int midVal = arr[mid];
if (findVal>midVal) {
//向右递归
return binarySeearch2(arr, mid+1, right, findVal);
}else if (findVal<midVal) {
return binarySeearch2(arr, left, mid-1, findVal);
}else {
List<Integer> resIndexlists = new ArrayList<Integer>();
int temp = mid-1;
while (true) {
if (temp<0||arr[temp]!=findVal) {//退出
break;
}
//否则,就temp放入到list
resIndexlists.add(temp);
temp-=1;//temp 左移
}
resIndexlists.add(mid);
//向mid索引值的右边扫描,将所有满足findVal的元素的下标,加入到集合ArrayList
temp = mid+1;
while (true) {
if (temp>arr.length-1||arr[temp]!=findVal) {//退出
break;
}
//否则,就temp,放入到list中
resIndexlists.add(temp);
temp+=1;//temp 右移
}
return resIndexlists;
}
}
}