二分查找
二分查找思想: 就是将要查找的目标数 和 数据中间的数进行比较
如果目标数比要查找的数小,则进行左递归,如果目标数比要查找的数大,则进行右递归。
直到找到目标数。
二分查找的前提是 数组中的 数据必须是有序的
package com.wuzhixin.datastructrue;
import java.util.ArrayList;
/**
* 吴志新
* 2019/9/5-8:42
* _23designpatterns
二分查找必须是有序的
**/
public class BinarySearch {
public static void main(String[] args) {
int []arr = {1,8,10,89,1000,1234,1000,1000};
ArrayList<Integer> integers = binarySearch2(arr, 0, arr.length - 1, 1000);
System.out.println(integers);
}
//找出第一次出现的索引
public static int binarySearch(int []arr,int start,int end,int targetValue){
if(start>=end){
return -1;
}
int mid = (start+end)/2;
//如果要查找的数比中间数小 ,左递归
if(targetValue<arr[mid]){
return binarySearch(arr,start,mid,targetValue);
}
//如果要查找的数比中间数大,右递归
else if(targetValue>arr[mid]){
return binarySearch(arr,mid+1,end,targetValue);
}
//如果相等,找到直接返回
else{
return mid;
}
}
//找出 所有的数
public static ArrayList<Integer> binarySearch2(int [] arr, int start, int end , int targetValue){
if(start>=end){
return new ArrayList<Integer>();
}
int mid = (start+end)/2;
if(targetValue<arr[mid]){
return binarySearch2(arr,start,mid,targetValue);
}else if(targetValue>arr[mid]){
return binarySearch2(arr,mid+1,end,targetValue);
}else{
ArrayList<Integer> targetIndexs = new ArrayList();
targetIndexs.add(mid);
//二分查找找到该值后,开始向左扫描,看看有没有相同的值
int temp = mid-1;
while(temp>=0){
if(targetValue==arr[temp]){
targetIndexs.add(temp);
}
temp--;
}
//二分查找找到该值后,开始向右扫描,看看有没有相同的值
/* while(true){
//如果temp
if(temp<(arr.length-1)|| targetValue!=arr[temp]){
break;
}
}*/
temp = mid+1;
while(temp<=(arr.length-1)){
if(targetValue==arr[temp]){
targetIndexs.add(temp);
}
temp++;
}
return targetIndexs;
}
}
}