C -- 二分查找

二分查找

  • 二分查找,实现很简单,但是有的同学第一次接触的时候可能会踩一些坑。
  • 本文以排好序的整数数组为例。
  • 讨论并实现二分查找。

二分查找,又叫折半查找,顾名思义,可以通过比较中间位置是否与要查找的相等。如果相等即找到了目标,否则,看目标落在中间位置左侧还是右侧,然后再同样的到对应区间去找。

分析考虑

假设我们有这样一个数组

#define MAXSIZE 10
int array[MAXSIZE] = {1,2,3,4,5,6,7,8,9,10};

我们可以标记左下标以及右下标

int left = 0;
int right = MAXSIZE - 1;

所谓折半,即下标,要搜索的位置折半

mid = (left + right) / 2;

我们需要一个循环来找寻目标整数,此处要确定循环结束条件,我们也可以先考虑比较的过程,即确定每一个分支落在左侧,右侧,相应的下标需要做什么(移动到新位置),当然如果此时查找到我们跳出即可

while(left <= right)
{
	mid = (left + 2) / 2;
	if(num < ar[mid])
		right = mid - 1;
	else if(num > ar[mid])
		left = mid + 1;
	else
		printf("find\n");
}
printf("Not find\n");

有同学可能会问,为什么新的left = mid + 1,新的right = mid + 1,因为当轮循环num != ar[mid],新的查找当然要到剩余区间去找啊。此时我们可以很容易确定循环跳出条件,当left > right时,即左下标越过右下标,其实就已经遍历完了,目标不在数组中。

写个函数吧

//三个参数,数组地址,数组大小,目标整数
int binary_search(int ar[], int n, int num)
{
	int left = 0;
	int right = n - 1;
	int ret = 0;
	
	while(left <= right)
	{
		mid = (left + right) / 2;
		if(ar[mid] == num){
			ret = 1;
			break;
		}else if(num < ar[mid])
			right = mid - 1;
		else
			left = mid + 1;
	}
	
	return ret;
}

这么写当然是没问题的。其实根据二分查找的定义,我们也可通过递归来实现。

递归实现

下次回来写,似乎有点麻烦。。。

发布了18 篇原创文章 · 获赞 4 · 访问量 843

猜你喜欢

转载自blog.csdn.net/GuoningningPro/article/details/103623894