二分查找
前提:待查找的序列有序。
思想:每次查找都取查找范围二分之一处的元素与目标值进行比较。
思路分析:
- 三个初始值:左标签left为0,右标签right为数组长度-1,中间位置mid为(left+right)/2。
- 如果不满足left<=right,说明找不到目标值,直接返回-1
- array[mid] == target,说明找到目标值,直接返回mid
- array[mid] > target,说明目标值小,需要往左继续寻找,右标签需要左移right = mid - 1
- array[mid] < target,说明目标值大,需要往右继续寻找,左标签需要右移left = mid + 1
代码示例:
public static int binary_search(int[] array,int target) {
int left = 0; //左指针
int right = array.length-1; //右指针
int mid; //中间位置
while (left <= right) {
mid = (left + right)/2;
if (array[mid] == target) { //找到目标值
return mid;
}else if (array[mid] < target) {//向右寻找
left = mid + 1;
}else { //向左寻找
right = mid - 1;
}
}
return -1; //找不到目标值返回-1
}
- 时间复杂度:折半搜索每次把搜索区域减少一半,时间复杂度为O(log n)。
- 空间复杂度: O(1)。