使用二分法(折半法)来在某个有序数组中查找某个具体的数字

//使用折半法来查找数组
//若找到对应的数,则输出,若没有找到则将查找的范围缩小一半继续查找
//因为此方法针对的为有序数组,所以才可以使用
//若是无序数组,则不能使用折半法进行查找
//定义一个数组的左边和数组的右边,创建一个循环
//当左边的小于右边的数组长度时就进行循环
//要写为left<=right,不然等于的情况进不去
//二分查找
#include<stdio.h>
#include<windows.h>
int main()
{
int arr[] = { 1,2,3,4,5,6 };
int to_find = 4;
int left = 0;//对应数组的第一个下标
int right = sizeof(arr) / sizeof(arr[1]) - 1;//对应数组的最后一个下标
int mid = 0;
//while循环的条件为left<=right
//因为当left=right时还需要进行循环,不能丢失left=right的情况
//通过比较to_find与数组中二分查找后的每一个值来确定是否找到
//当to_find<arr[mid]时说明这个值在数组的左半部分,则需要将right的范围往左半部分划分,因为to_find=arr[mid]的情况我们单独讨论,所以right的值为mid-1
//当to_find>arr[mid]时说明这个值在数组的右半部分,则需要将left的范围往数组的右半部分进行划分,因为to_find=arr[mid]的情况是我们需要的情况,所以left的值为mid+1
while (left <= right)
{
mid = (left + right) / 2;//没循环一次进行一次二分,来缩小查找的范围
if (to_find < arr[mid])
{
right = mid - 1;
}
if (to_find > arr[mid])
{
left = mid + 1;
}
if (to_find == arr[mid])//这是我们想要的情况,跳出循环
{
break;
}
}
//while循环跳出有两种可能,一种是通过while循环找到了对应的数,然后跳出了循环,一种是经过了所有循环也没有找到需要的数跳出了循环
//就是经过while循环的循环条件的,就是我们要找的数,另一种就是经过了while也没有找到我们要找的数,直到跳出了循环
//最后我们要输出mid的值,但是我们可以看到mid的作用域只是这个while循环
//有人说在mid 前面加上static改变的只是一个变量的生命周期,并不改变他的作用域,所以我们需要定义一个全局变量mid
if (left <= right)
{
printf(“找到了,这个数对应的下标为%d”, mid);
}
else
{
printf(“经过了这么多次循环也没有找到”);
}
system(“pause”);
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值