在自学二分查找的过程中我想到了一些变化问题,有的自己就慢慢理解了,有的在网上找到了答案,奈何没有找到想要的总结归纳。我就斗胆自己写了一篇,号称史上最全。希望和我一样的蒟蒻可以少走一点弯路。
二分查找凭借其低时间复杂度O(log(n))成为了各个蒟蒻的入门知识,但是其衍生出的各种题目相较原题目而言就没有那么容易求解,以下借用c语言实现二分查找算法及其衍生。二分查找仅适用于事先已经排好序的顺序表。其基本思路就是每次取中间数,如果中间数大于所求数就向上查找,反之向下。
一.原始二分查找
1.在有序数组中寻找一个数所在下标。
int main(){
int arr[] = {1,2,3,4,5,6,7,8,9};
int left,right,fin;
fin = 3;
left = 0;right = sizeof(arr)/sizeof(arr[0])-1;
while(left <= right) {
int mid;
mid = (left+right) / 2;
if (arr[mid] == fin) {
printf("找到了:%d\n", mid);
return 0;
}
if (mid < fin)
left = mid+1;
else if (mid > fin)
right = mid-1;
}
printf("没找到");
return 0;
}
对于这种基本的排序问题,我们通过判断mid变量与key的大小对有序数组进行二分。
当查找过程中,会出现key值下标坐落在left或right上时的情况,
以下用left举例
当left = key时,一个显然的结论,此时arr[mid]无法等于key。其所作工作为减小right,进一步缩进范围,直到right = left或right = left+1,此时范围缩小到最小,mid = left。输出mid的值即为所求下标。
我们当然可以在left和right = key时直接输出key的下标,但是这样会造成多次比较。
二.二分查找的变化之数组元素重复
对于二分查找而言,会出现数组元素重复的情况,以下问题的求解建立在数组元素重复的情况下:
1.返回匹配数key的最小下标
#include int main() {
i