二分查找(C语言实现)
·
二分查找的前提:
一个整形有序数组中查找具体某个数
以下以数组元素为偶数个做例
二分查找(折半查找)的思想:对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。
下图为程序在数组中寻找整数6的过程
进入循环之前,先定义数组的左右下标:左下标为0,右下标为数组元素个数减去1
while (left <= right),当作下标小于右下标时,进入循环
第一次循环:
if 和else if语句内均没有break 语句,所以循环继续
第二次循环:
第三次循环:
跳出循环后判断right的关系,这个if语句是在没有找到的情况下进入
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//已知的整形有序数组
int x = 0;//x是要寻找的数
int left = 0;//左下标
int right = sizeof(arr) / sizeof(arr[0]) - 1;//数组右下标
scanf("%d", &x);
while (left <= right)
{
int mid = left+(right-left)/2;//找到最中间的数
if (x < arr[mid])
{
right = mid-1;
}
else if (x > arr[mid])
{
left = mid+1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (right < left)
{
printf("没找到");
}
return 0;
}
除了给定整形有序数组外,我们还可以自己输入一个有序数组和需要查找的数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[100];
int j = 0;//j为需要寻找的数
int i = 0;
int left = 0;
int right = 0;
while (1)
{
scanf("%d", &arr[i]);
i++;
if (getchar() == '\n')
{
break;//遇到回车则证明数组输入结束
}
}
scanf("%d", &j);
right = i - 1;//总共输入了i个元素,最大下标为i-1
while (left <= right)
{
int mid = left + (right - left) / 2;
if (j < arr[mid])
{
right = mid - 1;
}
else if (j > arr[mid])
{
left = mid + 1;
}
else
{
printf("找到了,下标为%d\n", mid);
break;
}
}
//左右下标发生交叉的情况,则证明没有找到
if (left > right)
{
printf("没找到\n");
}
return 0;
}
更多推荐
已为社区贡献5条内容
所有评论(0)