0
点赞
收藏
分享

微信扫一扫

【C语言】查找算法----二分查找、插值查找

梦想家们 2022-01-17 阅读 56

今天我们来看两种查找算法。

二分查找

这应该是初学者(指我自己)最常用的了,原理非常简单。对于要查找的数据,我们在有序数组里面对取前后下标的平均值mid,判断mid所对应的数和要找的键值的大小关系。

步骤:

①对数组排序;

②分别取变量int left=0;int right=sizeof(arr)/sizeof(arr[0])-1;int mid=(right+left)/2; 并判断arr[mid]和 要找的数n之间的大小;

③若相等,则跳出循环;

若n>arr[mid],说明要找的数在数组的右半边,则令left=mid+1;

若n<arr[mid],则令right=mid-1; 并重复步骤②③

上代码

#include<stdio.h>
int main()
{
	int arr[10] = { 9,33,66,74,88,96,123,144,156,200 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int n = 0;
	scanf("%d", &n);
	while (1)
	{
		int mid = (left + right) / 2;
		if (n == arr[mid])
		{
			printf("找到了,位置是%d\n", mid + 1);
			break;
		}
		else if (left >= right)
		{
			printf("找不到了\n");
			break;
		}
		else if (n < mid)//在左边
		{
			left = mid;
		}
		else if (n > mid)
		{
			right = mid;
		}
	}
	return 0;
}

插值查找

插值查找是二分查找的改进版。在二分查找中,如果数据量非常大,处理的时间就会很长。在原先的思想下,我们改取左右两边的平均数为按比例取中间值,请看公式

 步骤:

①数组排序;

②按公式取得中间值,然后比较中间值对应的数和要查找的数的大小;

③若相等,跳出循环;

若n>arr[mid],说明要查找的数在中间值的右边,则令mid=left+1;

若n<arr[mid],则令mid=right-1; 并重复步骤②③

上代码

#include<stdio.h>
int main()
{
	int arr[10] = {9,33,66,74,88,96,123,144,156,200};
	int left = 0;
	int right = 9;
	int n = 0;
	scanf("%d", &n);
	while (1)
	{
		int mid = left + ((n - arr[left]) / (arr[right] - arr[left])) * (right - left);
		if (n == arr[mid])
		{
			printf("\n找到了,位置是%d", mid+1);
			break;
		}
		else  if (left >= right)//先判断是否出界
		{
			printf("\n找不到了");
			break;
		}
		else if (n < arr[mid])//说明数在左边
			right = mid - 1;
		else if (n > arr[mid])
			left = mid + 1;
	}
	return 0;
}

希望与诸君共勉

举报

相关推荐

0 条评论