主要用于已经做了排序的数字,时间复杂度:log2n
直接贴代码
#include <stdio.h>
#include <stdlib.h>
int search(int search_num, int a[], int right)
{
int left = 0;
int ret = -1;
int mid;
while(right > left)
{
mid = (right + left) / 2;
if (a[mid] == search_num)
{
ret = mid;
break;
}
else if (a[mid] > search_num)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return ret;
}
int a[9] = {1, 3, 5, 6, 8, 10, 12, 15, 17};
int main()
{
/*二分法搜索方法
思路:
1.设置左标和右标,建立search函数做二分运算
2.函数建立
循环终止条件是当right > left
mid由(right + left) / 2得到
if
mid = 所求; break
if else
mid > 所求; left = mid + 1
else
mid < 所求 right = mid - 1
1, 3, 5, 6, 8, 10, 12, 15, 17
搜索3
left 0 right 8 mid 4 a[mid] 8 > 3 right = mid - 1
*/
int left = 0, len, ret;
int search_num;
scanf("%d",&search_num);
len = sizeof(a) / sizeof(a[1]);
ret = search(search_num, a, len-1);
if (ret == -1)
{
printf("数组中没有该值");
}
else
{
printf("%d在数组的第%d个位置",search_num,ret+1);
}
}
核心思路
/*二分法搜索方法
思路:
1.设置左标和右标,建立search函数做二分运算
2.函数建立
循环终止条件是当right > left
mid由(right + left) / 2得到
设置ret作为返回函数的值,如果ret为-1则查找失败,否则返回数组下标
if
mid = 所求; break
if else
mid > 所求; left = mid + 1
else
mid < 所求 right = mid - 1
1, 3, 5, 6, 8, 10, 12, 15, 17
搜索3
left 0 right 8 mid 4 a[mid] 8 > 3 right = mid - 1
*/
期间犯的错误:
1.低级错误,scanf("请输入查找的值:%d",search_num)
如果要有其他输出,用printf输出
2. right与left需要做-1 +1操作
3. 区分len长度与right的关系,len是数组长度,right是右边下标,right = len - 1
4. 数组传参的时候,函数中只要 search(a),传入数组名即可,函数search(int a[])中[]不能省略,并且记得表明数据类型