折半查找
,又称为二分查找
。是一种效率较高的查找算法、折半查找的算法思想是将数列按有序化
(递增或递减)的顺序排列。
折半查找的基本思路是设R[low…high]是当前的查找区间,首先我们需要确定该区间的中点位置:mid = (low + high) / 2,然后将需要查找的值value与R[mid]比较:
- (1)如果value 与R[mid]的值相等,则查找成功,并且返回该查找值value的索引值。
- (2)如果value大于R[mid]的值,则在后(右)半个区域继续进行折半查找。
- (3)如果value小于R[mid]的值,则在前(左)半个区域继续进行折半查找。
下面是折半查找(二分查找)的两种实现方式分别是:非递归实现
与递归实现。
注:实现二分查找的条件:
- 必须采用顺序存储结构。
- 必须按关键字大小有序排列。
(1)非递归实现。
/**
* 二分查找(折半查找算法)
* @param R 数组
* @param value 查找的值
* @return
*/
public static int BinSearch01(int[] R , int value){
int low = 0;
int high = R.length - 1;
int mid;
while(low <= high){
mid = (low + high) / 2;
if(value == R[mid]){
return mid;
}
if(value < R[mid]){
high = mid -1;
} else {
low = mid + 1;
}
}
return -1;
}
(2)递归实现。
/**
* 折半查找、二分查找(递归实现)
* @param R 已经排好序的数组
* @param low 数组的起始位置
* @param high 数组的末尾位置
* @param value 需要查找的值
* @return
*/
public static int BinSearch02(int[] R,int low,int high,int value){
int mid = (low + high) / 2;
if(value == R[mid]){
return mid;
}
if(low >= high){
return -1;
}else if(value < R[mid]){
return BinSearch02(R,low,mid-1,value);
}else if(value > R[mid]){
return BinSearch02(R,mid+1,high, value);
}
return -1;
}