[日常练习] 8. 基于有序数组指定元素的二分查找C语言实现!

问题描述:

采用折半(二分)查找的方式,在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-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,此时,就没有办法得到数组元素的个数!

这一点我们一定要牢记牢记!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值