栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

减治法之有序数组查找问题(折半查找)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

减治法之有序数组查找问题(折半查找)

【问题描述】

        应用折半查找方法在一个有序序列中查找值为k的记录;查找成功,返回记录k在序列中的位置。

【分析】

        折半查找(binary search)利用了记录序列有序的特点,其查找过程是:取有序序列的中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录,则在中间记录的左半区继续查找;若给定值大于中间记录,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功;其减治思想如图所示。

例如,在有序序列{7,14,18,21,23,29,31,35,38}中查找18。


【算法】
        折半查找算法用伪代码描述如下。

输入:有序数列a[n],待查找区间[l,r],待查找值k;

输出:查找成功,返回k的位置,

划分区间m=(l+r)/2

将区间分为两部分,[l,m],  [m+1,r]

如果k

如果k>m,则对右半区间进行查找,递归

如果k=m,则查找成功,返回该元素对应的下标

【算法实现】

#include

int search(int a[], int l, int r, int k)
{
	int m = (l + r) / 2;			//划分区间
	if (a[m] == k) return m;		//递归出口
	else if (a[m] > k)
	{
		search(a, l, m - 1, k);		//查找左区间
	}
	else if (a[m] < k)
	{
		search(a, m + 1, r, k);		//查找右区间
	}
}

int main()
{
	int k;
	int a[100];
	int n;
	int l, r;
	int result;
	printf("序列长度:");
	scanf("%d", &n);
	printf("待查找数组:");
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	printf("查找区间:");
	scanf("%d %d", &l, &r);
	printf("要查找的元素:");
	scanf("%d", &k);
	result = search(a, l, r, k);
	printf("该元素的下标为:%d", result);
}

 【输出结果】

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/656138.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号