有序数组查找——C语言

对于一个有序数组进行查找可以有很多种方法,目前还在C语言阶段,所以就学了三种分别是常规查找,折半查找,函数查找(这些方法都是差不多的);

接下来我就先讲:

1.常规查找

      常规查找就是数组从左到右一个一个与被查找的关键字比较,相等就是找到了,则输出下标;如果到最后都没有与之相等的数据那就是找不到这个数,则输出找不到这个元素。知道了思路就开始写代码了:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//简单的取十个数
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
	int key = 0;
	printf("请输入想要查找的元素:");
	scanf("%d", &key);
	while (i < sz)
	{
		if (arr[i] == key)
		{
			printf("\n找到了,元素下标是%d\n",i);
			break;//找到了就跳出循环
		}
		i++;
	}
	if(i > sz-1)
		{
			printf("\n元素找不到\n");
		}
	return 0;
}

while循环也可以写for循环,差不多一样。循环停止条件就是整个数组全部查找完,当数组大于最后一个(sz-1)时就没有元素相比较了。

2.折半查找(二分查找)

      折半查找顾名思义对半从中间开始查找,当查找的数与中间元素相比,大了(key>arr[mid])就可以舍去前半部分(有序表);小了(key<arr[mid])就可以舍去后半部分。接着开始同样的操作,但是这里的left或right不再一样了。

 关于mid=(left+right)/2这样写也可以,但是更严谨一点就是mid=left+(right-left)/2(这样写是为了防止溢出,int类型存放的元素有限制  left+right怕超出范围)。

假如key=7;则key>arr[mid],需要挪动left,left需要挪到mid后一个数上(即left=mid+1),因为在比较中已经与mid比较过了,所以不需要再次比较。假如key<mid,则需要挪动right,right=mid-1。如下图:

现在arr[mid]=8,与要查找的key=7相比大了,再继续上面相同的操作,如下图:

现在arr[mid]=6,比key=7小,则挪动left的位置,这时left,right和mid三个都指向同一个数,这个被查找的数就找到了。

假如这个数组里没有要查找的数,而程序不知道这个数组全部查询完了,如果再往下走同样的操作,就会出现left在后right在前的情况,所以需要我们自己设置一个条件(left<=right) 防止重复查询。下面是折半查找的代码:

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int sz=sizeof(arr)/sizeof(arr[0]);
	int left = 0;
	int right = sz-1;
	int key = 0;
	int i = 0;
	printf("请输入想要查找的元素:");
	scanf("%d", &key);
	while (left <= right)
	{
		int mid = left+(right-left)/2;//防止溢出(int存放的元素有限制)
		if (arr[mid] == key)
		{
			printf("\n找到了,元素下标是%d\n", mid);
			break;
		}
		else if (arr[mid] > key)
		{
			right = mid - 1;//大了,挪right
		}
		else
		{
			left = mid + 1;//小了,挪left
		}
	}
	if (left > right)
	{
		printf("\n元素找不到\n");
	}
	return 0;
}

 3.函数查找

函数查找就是设置调用一个函数进行查找,这个方法与第二个差不多,主要要注意的就是返回值,以及函数的调用时并不是将整个数组传过去(我在下面代码中标注了)。

#include<stdio.h>
int binary_search(int arr[], int key, int sz)
{
	int left = 0;
	int right = sz-1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;//防止溢出(int存放的元素有限制)
		if (arr[mid] == key)
		{
			return mid;
		}
		else if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return -1;//-1是为了与下标0-9区分开
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int key = 0;
	printf("请输入想要查找的元素:");
	scanf("%d", &key);
	int ret = binary_search(arr, key, sz);//arr数组在传参时只把首元素地址传到函数中
	if (ret == -1)
	{
		printf("\n元素找不到\n");
	}
	else
	{
		printf("\n找到了,元素下标是%d\n", ret);
	}
	return 0;
}

 以上就是我所学的有序数组的查找,目前能力有限只能写到这。

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值