- 二分查找也称折半查找,它是一种效率较高的查找方法(每一次的查找都可以缩短一半要查找的范围)
- 使用的前提要保证数组是有序的
查找的过程
- 首先我们要先找出数组存储数值最小的下标(left)和存储数值最大的下标(right),使得我们可以得到中间下标的位置(mid)
- 我们把要查找的数和数组中间下标存储的值进行比较,要是相等就退出,要是要查找的数字大于数组中间下标存储的数字,那我们就让left等于mid+1,否则如果要查找的数字小于中间下标存储的数,那我们就让right等于mid-1
- 循环结束调节是left <= right
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdbool.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0])-1;//下标从0开始
int k = 7;//查找的数
int mid = 0;
bool flag = false;
while (left <= right)
{
mid = (left + right) / 2;
if (k < arr[mid])
{
right = mid - 1;
}
else if (k > arr[mid])
{
left = mid + 1;
}
else
{
flag = true;
break;
}
}
if (flag)
{
printf("找到了,下标是:%d\n", mid);
}
else
{
printf("没找到\n");
}
return 0;
}
然后我扩展一个题目(跟二分查找无关)
题目:多个字符从两端移动,向中间汇聚
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
//多个字符从两端移动,向中间靠拢
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1)-1;//计算'\0'前的字符,下标从0开始所以-1
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
//1000单位毫秒等于1秒,作用时程序休息1秒,使用要包含头文件<windows.h>
Sleep(1000);
//system:库函数用来执行系统命令,使用要包含头文件<stdlib.h> cls:清理屏幕
system("cls");
left++;
right--;
}
//因为循环最后执行力cls,所以最后我们还要单独在输出一次arr2
printf("%s\n", arr2);
return 0;
}