2020-12-25

二分查找

1.二分查找基本概念:

二分查找又称折半查找,折半查找就是使有序数列不断缩小为原来的一半,直到找到该元素或折半区域的首元素位置高于尾元素位置为止
输入10个有序的数字和想要查找的关键字,然后用折半查找,找到关键字在数组中的位置

2.二分查找的一般步骤:

折半查找是一种高效的查找方法,该方法可以明显减少比较次数,提高查找效率,但是,折半查找的先决条件是查找表中的元素必须是有序的

首先,必须设定3个变量low,mid,high,分别保存数组元素的开始,中间和结尾的序号,假定有10个元素,则令low=0,high=9,mid=(low+high)/2=4
然后进行以下判断:
(1)如果序号为mid的值与要查找的元素x相等,表示找到了数据,返回对应的序号mid
(2)如果x<a[mid],表示要查找的数据位于low与mid-1序号之间,就不需要查找mid与high之间的元素了,因此,将变量high的值定为mid-1,重新查找low与mid-1之间的数据
(3)如果a[mid]>x,说明要查找的元素位于mid+1与high之间,low=mid+1,重新查找mid+1与high之间的数据
(4)逐步循环如果到low>high时,还未找到目标,就说明数组中无此数据
折半查找的基本思想就是将数列按有序化排列,查找过程中采用跳跃方式查找,即先以有序数组的中间位置为比较对象,如果要找的元素小于该元素,则将待查序列缩小为左半部分,否则为右半部分,通过一次比较,将区间缩小一半

代码部分如下:

#include<stdio.h>
int search(int a[], int n, int x)
{
    
    
	int low, mid, high;
	low = 0;
	high = n - 1;
	while (low <= high)
	{
    
    
		mid = (low + high) / 2;
		if (a[mid] == x)
			return mid + 1;
		else if (a[mid] > x)
			high = mid - 1;
		else
			low = mid + 1;
	}
	return 0;
}
int main()
{
    
    
	int i, x, z;
	int a[10];
	printf("请输入10个有序数字,并用分号隔开:");
	for ( i = 0; i <10 ; i++)
	{
    
    
		scanf_s("%d", &a[i]);//为有序数组赋值
	}
	scanf_s("%d", &x);
	z = search(a, 10, x);
	if (z)
		printf("您要查找的数%d在数组中的位置是第%d个元素\n", x, z);
	else
		printf("您要查找的元素%d不在数组中\n", x);
	return 0;
}

3.二分查找的优缺点:

二分查找的优点:平均查找长度小于log2n,即经过一次比较,缩小一半查找范围,经过log2n次比较即可完成折半查找
二分查找的缺点:因为要求数列必须是有序的,所以查找数列必须有序,而对所有数据元素按大小排列是非常费事的操作,另外,顺序存储结构的插入,删除操作不方便

猜你喜欢

转载自blog.csdn.net/weixin_51476766/article/details/111699204