啊我摔倒了..有没有人扶我起来学习....
前言
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素有序排列
一、确定整体思路
- 二分查找实现的是在有序存储的结构(如数组)里找出所需要查找的值,那么我们就把二分查找封装成一个函数,找到所需要的值后,返回对应下标
1.1 定义一个数组
- 我们就拿一个有序数组举例子
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- 同时,我们要把数组的长度也求出来,因为等会儿调用函数时要传给形参
int sz = sizeof(arr) / sizeof(arr[0]);
1.2 确定函数形参个数
- 因为我们需要通过该数组进行查找,首先就需要该数组的地址以及长度,其次就是要查找的那个数也要传给函数
int serial = Binary_search(arr, sz, key);
封装好的函数返回值分两种情况:
- 找到了,那就返回对应的下标
- 没找到,那就返回一个数组中不存在的下标,方便判断
if (serial >= 0)
printf("找到了!值为%d的数组下标为%d\n", key, serial);
else
printf("找不到\n");
二、设计实现二分查找的函数
- 根据所传过来的实参,以及返回值的判断,可以确定该函数的框架
int Binary_search(int* str, int num, int n)
{
//.......
return //找到的数的下标;
return -1;
}
- 函数具体功能的实现,需要我们先来了解以下二分查找:
- 我们指定三个变量
left
、right
、mid
来存储数组==下标==
- 假如我们要找的数是
7
,那么用7
和str[mid]
进行对比,7
比str[mid]
大,那就进行折半
此时把mid+1
的值赋给left
。为啥不是mid
的值给left
?因为mid
那个位置已经判断过了。。同理,给right-1
- 就这样循环往复,最终mid都会被
left
和right
夹着,这时str[mid]
还是不等于k
,就说明找不到了。
int Binary_search(int* str, int num, int n)
{
int left = 0;
int right = num - 1;
int mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (str[mid] < n)
left = mid + 1;
else if (str[mid] > n)
right = mid - 1;
else
return mid;
}
return -1;
}