文章目录
1 原理
适用于 经常查找的
,但是 不变的
(增删)的 有序列表
算法思想:
有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功
优缺点:
优点:比较次数少,查找速度快,平均性能好
缺点:要求待查表为有序表,且插入删除困难
折半查找方法适用于不经常变动而查找频繁的有序列表
原理图:
2 实现
2.1 原理代码实现
// 折半查找 (二分查找)
public class BinarySearch {
private int rCount = 0;
private int lCount = 0;
// 获取递归的次数
public int getrCount(){
return rCount;
}
// 获取循环的次数
public int getlCount(){
return lCount;
}
/*
执行递归二分查找,返回第一次出现该值的位置
@param sortedData 已排序的数组
@param start 开始位置
@param end 结束位置
@param findValue 需要找的值
@return 值在数组中的位置,从0开始。找不到返回-1
*/
public int searchRecursive(int[] sortedData,int start,int end,int findValue){
rCount++;
if(start<=end){
// 中间位置
int middle = start+((end-start)>>1); //相当于(end-start)/2\
// int middle = (start+end)/2; //相当于(end-start)/2\
// 中值
int middleValue = sortedData[middle];
if(findValue==middleValue){
return middle; // 等于中值直接返回
} else if(findValue<middleValue){
//小于中值时在中值前面找
return searchRecursive(sortedData,start,middle-1,findValue);
}else{
//大于中值在中值后面找
return searchRecursive(sortedData,middle+1,end,findValue);
}
}else{
return -1; // 找不到
}
}
/*
循环二分查找,返回第一次出现该值的位置
@param sortedData 已排序的数组
@param findValue 需要找的值
@return 值在数组中的位置,从0开始。找不到返回-1
*/
public int searchLoop(int[] sortedData,int findValue){
int start = 0;
int end = sortedData.length-1;
while (start<=end){
lCount++;
int middle = start+((end-start)>><