何为二分查找?二分查找也叫折半查找,但是二分查找要求线性表是有序表的,即表中的元素按关键字有序排列。所以此方法只适用于顺序表,而不能用于链式存储结构。如果使用暴力的遍历方式来查找目标元素,时间复杂度为 O(n);然而使用二分查找,时间复杂度为 O(log₂n)。因此,二分查找是一种高效率的查找方法。
二分查找思路:假设在数组 nums[10]={1,2,3,4,5,6,7,8,9,10} 中查找目标元素 target 。
图中深色为查找区间;定义查找区间左端点 left=0,右端点 right = 9 (最后一个元素下标)。确定查找区间的中间端点 mid=(left+right)/2 (默认向下取整) ;然后将目标元素 target 与 中间端点值nums[mid] 比较:
①如果 nums[mid] ==target;说明找到该元素,返回其下标 mid;
②如果 nums[mid] > target;说明 target 一定在区间 [left, mid-1] (图中深色区域),那么就跟新右端点 right=mid-1;
③如果 nums[mid] < target;说明 target 一定在区间 [mid+1, right] (图中深色区域),那么就跟新右端点 left=mid+1;
上诉的步骤①②③只是一次查找的过程;所以我要通过循环来不断跟新查找区间 left 和 right,即是 while(left<=right)中,重复步骤①②③;如果一直执行到循环结束,说明数组 nums 中不存在 target 这个元素。那么就要返回一个负数表示没有此元素 (负数有代表性,因为数组下标不可能为负数)。

#include<stdio.h>
#include<stdlib.h>
int binartsearch(int* nums, int n,int target)
{
int left = 0, right = n - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] > target)
right = mid - 1;
else
left = mid + 1;
}
return -1; //-1表示找不到target元素
}
int main()
{
int ans[10] = { 2,4,5,1,7,8,10,9,3,6 };
int target = 0;
printf("输入查找元素:");
scanf("%d", &target);
for (int i = 0; i < 10; i++) //二分查找基于数组元素有序(冒泡排序)
{
for (int j = 0; j < 10 - i - 1; j++)
{
if (ans[j] > ans[j+1])
{
int tmp = ans[j];
ans[j] = ans[j + 1];
ans[j + 1] = tmp;
}
}
}
int val = binartsearch(ans, 10, target); //返回查找值的下标
if (val == -1)
printf("没有此元素\n");
else
printf("此元素下标为%d", val);
return 0;
}
如果对你有帮助的话,留个赞在走吧!!!!!

433

被折叠的 条评论
为什么被折叠?



