一、基本思路
请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。
二分查找思路分析
1.首先确定该数组的中间下标 mid=(tou+wei)/2
2.然后让需要查找的数shu和arr[mid]比较
if shu>arr[mid] 说明在中间数的右边,需要递归向右查询
if shu<arr[mid] 说明在中间数的右边,需要递归向左查询
if shu==arr[mid] 说明找到,就返回
找到就结束递归,整个数组都没找到结束递归,zuo>you结束递归
二、代码实现
package com.ws.查找.二分查找;
//二分查找前提是数组是有序的
public class BinarySearch {
public static int a=0;
public static void main(String[] args) {
int arr[]={1,8,10,54,24,1777,8999,9999};
int i=zhao(arr,0,arr.length-1,1777);
System.out.println("找到的索引是="+i);
System.out.println("找到的值是="+arr[i]);
System.out.println("查找的次数是="+a);
}
/**
* 二分查找
* @param arr 数组
* @param zuo 左边索引
* @param you 右边索引
* @param value 要查找的值
* @return 返回找到的下标,没有找到就返回-1
*/
public static int zhao(int[] arr,int zuo,int you,int value){
a++;
//当zuo>you时,就没找到,结束递归
if (zuo>you){
return -1;
}
int mid=(zuo+you)/2;//中间
int midValue=arr[mid];//中间的值
if (value>midValue){//向右递归
return zhao(arr,mid+1,you,value);
}
else if (value<midValue){//向左递归
return zhao(arr,zuo,mid-1,value);
}else {
return mid;
}
}
}
找到的索引是=5
找到的值是=1777
查找的次数是=2
升级
package com.ws.查找.二分查找;
import java.util.ArrayList;
import java.util.List;
//二分查找前提是数组是有序的
public class BinarySearchs {
public static void main(String[] args) {
int arr[]={1,8,10,54,24,1777,1777,1777,8999,9999};
List<Integer> i=zhao(arr,0,arr.length-1,1777);
System.out.println("找到的值是="+i);
}
/**
* 二分查找
* @param arr 数组
* @param zuo 左边索引
* @param you 右边索引
* @param value 要查找的值
* @return 返回找到的下标,没有找到就返回-1
*/
public static List<Integer> zhao(int[] arr, int zuo, int you, int value){
//当zuo>you时,就没找到,结束递归
if (zuo>you){
return new ArrayList<Integer>();
}
int mid=(zuo+you)/2;//中间
int midValue=arr[mid];//中间的值
if (value>midValue){//向右递归
return zhao(arr,mid+1,you,value);
}
else if (value<midValue){//向左递归
return zhao(arr,zuo,mid-1,value);
}else {
//升级 找到相同的数
//1.找到数不要马上返回,要mid索引的左边扫描,一样的加入到集合
//2. 要mid索引的右边扫描,一样的加入到集合
//3.将集合返回
List<Integer> list=new ArrayList<Integer>();
//向左边扫描
int temp=mid-1;
while (true){
if (temp<0||arr[temp]!=value){
//退出
break;
}
//否则将左边找到的放入到集合
list.add(temp);
temp-=1;//左移
}
list.add(mid);//中间找到的
//向右边扫描
temp=mid+1;
while (true){
if (temp>arr.length-1||arr[temp]!=value){
//退出
break;
}
//否则将右边找到的放入到集合
list.add(temp);
temp+=1;//右移
}
return list;
}
}
}
找到的值是=[6, 5, 7]