二分查找(Java)
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
查找过程:每次将待查记录所在区间缩小一半
适用条件: 采用顺序存储结构的有序表
递归方法
代码如下
public class Binarysearch {
public static void main(String[] args) {
int arr[]= {2,4,6,9,11,25,37};
int index=binarysearch(arr,0,arr.length,11);
if(index==-1) {
System.out.println("没有该元素");
}else {
System.out.println("二分查找,该元素下标为:"+index);
}
}
public static int binarysearch(int []arr,int left,int right,int value) {//left:左边索引,right:右边索引,value:查找的元素
if(left>right) {
return -1;
}
int mid=(left+right)/2;
int midvalue=arr[mid];
if(value>midvalue) {//向右递归
return binarysearch(arr,mid+1,right,value);
}else if(value<midvalue){//向左递归
return binarysearch(arr,left,mid-1,value);
}else {
return mid;
}
}
}
运行结果
二分查找,该元素下标为:4
算法改进
如果遇到查找有序表中有相同的元素时,查找算法应返回所有相同元素的下标。改进:只需在查询到的mid索引处,左右扫描是否有相同元素即可。
代码如下
import java.util.ArrayList;
import java.util.List;
public class Binarysearch {
public static void main(String[] args) {
int arr[]= {2,4,6,9,11,11,25,37,};
List<Integer> Indexlist=binarysearch(arr,0,arr.length,11);
System.out.println("二分查找,该元素的下标分别为:"+Indexlist);
}
public static List<Integer> binarysearch(int []arr,int left,int right,int value) {//left:左边索引,right:右边索引,value:查找的元素
if(left>right) {
return new ArrayList<Integer>();//返回空
}
int mid=(left+right)/2;
int midvalue=arr[mid];
if(value>midvalue) {//向右递归
return binarysearch(arr,mid+1,right,value);
}else if(value<midvalue){//向左递归
return binarysearch(arr,left,mid-1,value);
}else {
List<Integer> indexlist=new ArrayList<Integer>();
int temp=mid-1;//向左扫描
while(true) {
if(temp<0||arr[temp]!=value) {
break;
}
indexlist.add(temp);//如果有相同查找元素,则加入
temp-=1;//temp左移,判断是否还有相同的元素
}
indexlist.add(mid);
temp=mid+1;//向右扫描
while(true) {
if(temp>arr.length-1||arr[temp]!=value) {
break;
}
indexlist.add(temp);//如果有相同查找元素,则加入
temp+=1;//temp右移,
}
return indexlist;
}
}
}
运行结果
二分查找,该元素的下标分别为:[4, 5]
非递归方法
代码如下
public class Binarysearch {//非递归法
public static void main(String[] args) {
int arr[]= {2,4,6,9,11,25,37,};
int index=binarysearch(arr,11);
if(index==-1) {
System.out.println("没有找到该元素!");
}else {
System.out.println("查找元素的下标为:"+index);
}
}
public static int binarysearch(int []arr,int temp) {
int left=0;
int right=arr.length-1;
while(left<=right) {
int mid=(left+right)/2;
if(arr[mid]==temp) {
return mid;
}else if(arr[mid]>temp) {//向左查找
right= mid-1;
}else {//向右查找
left=mid+1;
}
}
return -1;
}
}
运行结果
查找元素的下标为:4