折半查找,⼜称“⼆分查找”,仅适⽤于有序的顺序表。
算法思想图示:
查找成功示例:
Step1:
Step2:
Step3:
Step4:
查找失败示例:
Step1:
Step2:
Step3:
Step4:
Step5:
示例代码:
- 力扣-第275题:H 指数
- 通用代码:
又找到一个不同版本的代码:
public class Solution {
/**
* @param A an integer array sorted in ascending order
* @param target an integer
* @return an integer
*/
public int findPosition(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0, end = nums.length - 1;
// 要点1: start + 1 < end
while (start + 1 < end) {
// 要点2:start + (end - start) / 2
int mid = start + (end - start) / 2;
// 要点3:=, <, > 分开讨论,mid 不+1也不-1
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
start = mid;
} else {
end = mid;
}
}
// 要点4: 循环结束后,单独处理start和end
if (nums[start] == target) {
return start;
}
if (nums[end] == target) {
return end;
}
return -1;
}
}
折半查找中要注意的事项:
- 注意满足判断条件后:low = middle + 1 OR high = middle - 1
- 注意查找成功和查找失败时,low、high指针的位置关系。成功时:low和high和middle指向同一个位置;失败时:low在high后一个位置(high在low前一个位置)
参考引用:
- 王道考研/CSKAOYAN.COM 数据结构课程PPT
- heliuphy的博客|二分法