问题描述:
采用折半(二分)查找的方式,在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1。
问题分析及源代码:
有序数组它的关键就是数组下标最小值及最大值,二分查找就是针对有序数组最为简单的一种查找方式。关键注意循环的建立及跳出条件,当左侧left都以经大于右侧right时,宣告查找完毕!源代码及结果如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int my_search(int arr[], int key, int left, int right) //参数为数组、查找元素、数组下标最小值、数组下标最大值
{
while (left <= right) { //当left已经超过right时,及数组元素已经被找到了
int mid = left + (right - left) / 2;
if (key < arr[mid]) { //判定所查找元素是否在左半边
right = mid - 1; //若是,则缩小分区范围
}
else if (key > arr[mid]) { //判定所查找元素是否在右半边
left = mid + 1; //若是,则缩小分区范围
}
else {
return mid;
}
}
return -1;
}
int main()
{
int key = 0;
int sz = 0;
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int ret = 0;
scanf("%d\n", &key);
sz = sizeof(arr) / sizeof(arr[0]);
ret = my_search(arr, key, 0, sz-1);
if (ret == -1) {
printf("没找到\n");
}
else {
printf("元素下标为:%d\n", ret);
}
system("pause");
return 0;
}
结果满足预期,成功!注意这种折中查找的算法应用、思想,尤其是循环的条件及左右参值的改变情况即要求!
深入思考:为什么函数需要传入数组的元素个数呢?直接 函数体内sizeof不应该更加准确方便吗?
函数的参数即为形参,形参是实参的一份临时拷贝,数组作为参数时直观上拿一个数组进行接收,但是这样再创建一个数组是需要时间及空间的,这便造成了浪费!此时的“形参数组”实则“挂羊头卖狗肉”,它的实质是一个指针,只需要读这个数组的内容即可,即是数组的起始地址。如果函数参数为数组时,这个参数是同数组类型的指针变量,传去数组首元素的地址,指针变量sizeof均为4,此时,就没有办法得到数组元素的个数!
这一点我们一定要牢记牢记!