#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
int key;
int low = 0;
int high = sz;
int mid = 0;
printf("请输入要找的元素:");
scanf("%d", &key);
while (low <= high) {
mid = low + (high - low) / 2;
if (key > arr[mid]) {
low = mid + 1;
}
else if(key < arr[mid]) {
high = mid - 1;
}
else {
printf("找到了,位置是:%d", mid);
break;
}
}
if (low > high) {
printf("不在数组之中!");
}
}
折半查找也叫二分法查找,其主要思想是在一个数组中,数组的元素是有序的整型,
首先,设置两个指针,分别指向数组的最右端和最左端,
例如 int low = 0;//指向数组arr的最右端;
int high = sizeof(arr)/sizeof(arr[0]);
注:sizeof是返回实体所分配内存空间的字节数,
将总的内存字节数sizeof(arr)除以 一个元素所分配的内存空间sizeof(arr[0])
就可以求出整个数组的元素个数。
第二步是设置一个中间变量指针,通过最右端和最左端相加求得其平均值作为中间变量
找到中间变量的处理,我首先的想法是int mid = (low + high)/ 2;但是这种方式会出现一个小的问题就是:两个整形数字low和high如果很小的话,影响不大,但是如果两个数字均很大,那么就有可能超过整型变量的最大值。
因此需要改变求中间变量的方法,另一个方法如下:mid = low + (high - low) / 2;两个不同大小的变量,两个变量的差进行除以二,再相加到low,所求出来的数字就是中间变量,这种方法也不会出现变量值超过整形的最大值。
第三步,将所要寻找的数字与中间指针所指元素进行大小比较,在比较中会出现三种情况
- 查找元素比中间元素大,则low = mid +1;
- 查找元素比中间元素小,则high = mid - 1;
- 查找元素与中间元素相等时,则输出查找成功;
在折半查找的实现中,需要注意while循环条件必须low <= high,因为当low == high的时候代表找到所要求的元素。