今天学习的是在一个有序数组中查找具体某个数N
思路:
找出这组数字里面最中间的那个元素的下标,以这个元素与要查找元素的比较;
在数组里,一组数的下标是从0开始的
我们将采取二分查找法,即折半查找,二分查找;
if查找的数字是7,即它的下标为6,下面即是运用二分查找法进行计算:
![](https://i-blog.csdnimg.cn/blog_migrate/6d5fdeaa3b1c9b3a772bcbc5d994cb64.jpeg)
如图所示在数组里,一组数的下标是从0开始的,
1 2 3 4 5 6 7 8 9 10 一一对应
0 1 2 3 4 5 6 7 8 9
(0+9)/2=4;下标是4,是第5个元素,所以pass掉1 2 3 4 5;
(5+9)/2=7;下标是7,是第8个元素,所以pass掉8 9 10;
(5+6)/2=11;下标是5,是第6个元素,所以pass掉6;
(6+6)/2=6;下标是6,是第7个元素,正是要访问的元素7;
![](https://i-blog.csdnimg.cn/blog_migrate/1bb9a62c341147e9afd19440a7bb35fe.jpeg)
在代码中会定义left mid right
![](https://i-blog.csdnimg.cn/blog_migrate/b9166da762f8c190477768ce63f8ed6d.jpeg)
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/3153eb9dd163f3cb31abb40519345f62.png)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//定义一个命名为arr的数组,有10个元素
int k = 7;//要查找的数字7
//在数组arr这个有序数组中查找k(7)的值
int sz = sizeof(arr) / sizeof(arr[0]);//获得数组的元素个数
//数组的总大小/数组一个元素的大小=数组元素的个数
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right=mid-1;
}
else
{
printf("找到了:%d\n", mid);
break;
}
if (left > right)
{
printf("找不到\n");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/448495d2973aefd894fb7a755bc997fa.png)