如果这篇文章对你有所帮助或者给了你灵感,欢迎给我点个小红心,如果没有,也可以点个赞支持一下,谢谢大家!!!
二分法
基本思想:
假设数据是按升序排序的,对于给定值key,从序列的中间位置 k 开始比较,
如果当前位置arr[k]值等于key,则查找成功;
若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1];
若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,high]。
时间复杂度:
1.最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(log2n)
2.最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)
下面给出具体代码:
#include<stdio.h>
#include<string>
int main()
{
int a[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int x;
printf("请输入你要查找的数字:\n");
scanf("%d", &x);
int right = sizeof(a) / sizeof(a[0]) - 1;
int left = 0;
while (left <= right){
int mid = (left + right) / 2;
if (x > a[mid]){
left = mid + 1;
}
else if (x < a[mid]){
right = mid - 1;
}
else{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left>right)
printf("找不到\n");
}
下图为运行结果:
都看到这了,就点个赞支持一下呗!