二分查找算法的实现

二分查找也是面试中考察基础算法思想的一类题,我就碰到了许多次。现在总结一下


思想 :二分法将待查的有序数列一分为二,用被查数据和数列的中数进行比较,如果被查数据比中数小,则到数列的前半部分去查,反之则去数列的后半部分去查,并一直循环这个操作,直到查找到待查数据,或者返回-1(被查数据不包含于指定数列中的情况)。

具体操作 :设置三个指针,start(指向待查数列的起始位置,开始时为0)、end(指向待查数列的末尾位置,开始时为数列长度-1)、mid(指向数列中数的位置,等于(start+end) / 2 ),比较一次之后,如果待查数据 key >arr [ mid ],说明我们应该去数列的下半部分查找,所以将start 指针移动到当前的mid+1 的位置,与此同时mid值也相应的发生了改变,另一种情况,当key ,说明我们应该去数列的上半部分查找,所以将end  指针移动到当前的mid-1 的位置。当 start 指针和 end  指针指向同一位置时,且key = arr [mid ],说明我们已经成功从待查数列中找到了key,返回key值得下标即可。


有两种实现二分查找的方法:


1、使用循环


public static int searchLoop(int[] sortedData, int findValue) {
/*
* 起始3个指针的状态 start = 0 end = 待查找数组的长度 - 1 mid 指向中间值
*/
int start = 0;
int end = sortedData.length - 1;
int mid;

while (start <= end) {
mid = (start + end) / 2; // 经过一次查找之后,如果没有查到,mid值总会发生变化
if (findValue < sortedData[mid]) {
end = mid - 1;
} else if (findValue > sortedData[mid]) {
start = mid + 1;
} else {
return mid;
}
}
return -1;
}


2、使用递归


public static int recursion(int[] sortedData, int findValue, int start, int end){
if (start <= end) {
int mid = (start + end) / 2; 
if (findValue < sortedData[mid]) {
return recursion(sortedData, findValue, start, mid - 1);
} else if (findValue > sortedData[mid]) {
return recursion(sortedData, findValue, mid + 1, end);
} else {
return mid;
}
}
return -1;
}




总结:二分查找效率很高,但是要求被查找的数列有序。

你可能感兴趣的:(算法)