二分查找 是logn的查找算法(前提已排序)
package main;
/**
*
*二分查找在事先排序的前提下的时间复杂度为logn,低于顺序查找
*/
public class Algorithm {
//递归实现,思路比较清晰,如果l == h,说明查到底了,如果还不等说明没有,否则,就递归找左和右,检查左和右的结果。
public static int binarySearch(int[] array ,int k){
return search(array, 0, array.length - 1, k);
}
private static int search(int[] array ,int low, int high, int k){
if (low == high) {
if (array[low] == k) {
return low;
}else {
return -1;
}
}else {
int middle = (low + high) / 2;
int l = search(array, low, middle, k);
int r = search(array, middle + 1, high, k);
if (l != -1) {
return l;
}else if (r != -1) {
return r;
}else {
return -1;
}
}
}
//非递归实现,当l<h时,说明没有找到,返回-1,否则就进入循环体,看中间,决定找左还是右。
public static int binarySearch1(int[] array ,int k){
int low = 0, high = array.length - 1;
while(low <= high){
int m = (low + high) / 2;
if(array[m] == k){
return m;
}else if (array[m] > k) {
high = m - 1;
}else {
low = m + 1;
}
}
return -1;
}
}