折半查找(非递归)的实现

#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,所求出来的数字就是中间变量,这种方法也不会出现变量值超过整形的最大值。

第三步,将所要寻找的数字与中间指针所指元素进行大小比较,在比较中会出现三种情况

  1.         查找元素比中间元素大,则low = mid +1;
  2.         查找元素比中间元素小,则high = mid - 1;
  3.         查找元素与中间元素相等时,则输出查找成功;

在折半查找的实现中,需要注意while循环条件必须low <= high,因为当low == high的时候代表找到所要求的元素。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值