热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C/MFC折半查找(二分查找)

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(logn)完成搜索任务。二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《WritingCorrectPr

折半查找的前提是已经对数据做好了排序,然后再折半查找。例如排序后的数据是1 5 12 35 64 78 89 123 456。你要查找12,首先用12跟上面排好顺序的9个数中间那个比较(64),12 <64,因此你查找的数据在前半部分,即 1 5 12 35 64,再用12跟前半部分中间那个数比较(12),这样找了2次就找到了。

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。折半查找的目的是提高查找的效率。

C语言的函数实现如下:

int binsearch(int x, int v[], int n)
{
	int low, high, mid;
	low = 0;
	high = n - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if(x  v[mid])
			low = mid + 1;
		else
			return mid;
		// 看看循环执行了多少次
		//printf("mid = %d, low = %d, high = %d n", mid, low, high);
	}
	return -1;
}

MFC运行结果:

MFC 程序如下:

char tmp[10] = "";
int rand_num[10];
CString str[10];
CString result;
CString sort_result;

void CNM_MFCDlg::OnBnClickedOk()
{
	CEdit* pBoxOne;
	pBoxOne= (CEdit*) GetDlgItem(IDC_EDIT1);

	srand((unsigned)time(NULL));
	for(int x=0; x <10; x++)
	{
		rand_num[x] =  rand()0;
		str[x] = itoa(rand_num[x],tmp,10);
		result = result + str[x] + _T(" ");
	}

	pBoxOne-> SetWindowText( result );
	//MessageBox(str,_T("程序运行结果"),MB_OK);
	result.ReleaseBuffer();
}

void CNM_MFCDlg::OnBnClickedButton1()
{
	CEdit* pBoxTwo;
	pBoxTwo = (CEdit*) GetDlgItem(IDC_EDIT2);
	selection_sort(rand_num,10);

	for(int x=0; x <10; x++)
	{
		str[x] = itoa(rand_num[x],tmp,10);
		sort_result = sort_result + str[x] + _T(" ");
	}

	sort_result = sort_result + _T("~ rn");
	//UpdateData(false);
	pBoxTwo-> SetWindowText( sort_result );
	sort_result.ReleaseBuffer();
}


void CNM_MFCDlg::OnBnClickedButton2()
{
	CEdit* pBoxThree;
	pBoxThree = (CEdit*) GetDlgItem(IDC_EDIT3);
	CString searchNum;
	CString showStr;
	char tmp[10] = "";
	//selection_sort(rand_num,10);

	pBoxThree -> GetWindowText(searchNum);

	int srh_n = _ttoi(searchNum);

	int result = binsearch(srh_n, rand_num, 10);
	showStr = itoa(result,tmp,10);

	MessageBox(searchNum + _T("所在数组的下标为") + showStr,_T("程序运行结果"),MB_OK);
}

void CNM_MFCDlg::OnBnClickedCancel()
{
	CDialogEx::OnCancel();
}

void selection_sort(int *a,int n)
{
	int i,j,s;
	for(i=0; i  v[mid])
			low = mid + 1;
		else
			return mid;
		// 看看循环执行了多少次
		//printf("mid = %d, low = %d, high = %d n", mid, low, high);
	}
	return -1;
}

记得在头文件声明函数。

将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x a[n/2],则我们只要在数组a的右半部继续搜索x。

二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。

刚开始的时候数组时排好顺序的:从小到大,或者从大到小。然后将这个数组折中,用中间的这个数和要查找的数比较大小。例如:如果我从小到大,我将数组这种后,用中间的数和要查找的数比较,如果小,则那个要查找的数绝对在中间靠左的范围里,如果大,则那个要查找的数绝对在中间靠右的范围里,然后同理,慢慢慢慢缩小范围,知道查找到为止。

本文地址:http://www.nowamagic.net/librarys/veda/detail/551,欢迎访问原出处。


推荐阅读
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 深入理解K近邻分类算法:机器学习100天系列(26)
    本文详细介绍了K近邻分类算法的理论基础,探讨其工作原理、应用场景以及潜在的局限性。作为机器学习100天系列的一部分,旨在为读者提供全面且深入的理解。 ... [详细]
  • 解决Spring Boot项目创建失败的问题
    在尝试创建新的Spring Boot项目时遇到了一些问题,具体表现为在项目创建过程中的两个关键步骤出现错误。本文将详细探讨这些问题及其解决方案。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
author-avatar
2702934635_941
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有