IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 二分查找法的递归和非递归实现(C++) -> 正文阅读

[C++知识库]二分查找法的递归和非递归实现(C++)

1.二分查找法思想

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。[引自百度百科]

2.算法使用前提

1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。

注:顺序存储结构-------逻辑上相邻的结点存储在物理位置上相邻的存储单元中,比如数组等结构

3.递归实现(C++)

#include <iostream>
using namespace std;
//二分查找发C++实现
int binarySearch(int a[], int x, int left, int right);//函数声明
int main()
{
	int a[] = {1,2,3,4,5,6,7,8,9};
	//int mark = binarySearch(a, 6, 0, sizeof(a)/sizeof(a[0]) - 1);//sizeof(a)/sizeof(a[0])为数组a的长度
	int mark = binarySearch(a, 11, 0, sizeof(a) / sizeof(a[0]) - 1);//sizeof(a)/sizeof(a[0])为数组a的长度
	if (mark == -1)
		cout << "未查找到" << endl;
	else
		cout << "查找到,下标为:" << mark << endl;
	
}
//数组a从小到大排列
int binarySearch(int a[], int x, int left, int right)
{
	//还可以做优化
	int mid = (left + right) / 2;
	if (a[mid] == x)
		return mid;
	else if(left == right)
		return -1;//表示没有找到
	else if (a[mid] < x)
		binarySearch(a, x, mid + 1, right);
	else if (a[mid > x])
		binarySearch(a, x, left, mid-1);
}

这里实现的功能是:查找整型数组a(升序)中是否存在某个整数,如果存在返回其在数组中的下标,如果不存在返回-1
其中算法可以进一步优化,比如,先判断x的范围是否在数组a[0]到a[len(a)-1]中,如果不在直接返回-1

4.非递归实现(C++)

递归算法改成非递归,是广大计算机从业者必须掌握的一个技能。
原因在于:
1.在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出。
2. 递归算法虽简洁,但运行效率较低,有很大优化的空间

递归算法->非递归算法

将递归算法转换为非递归算法有两种方法,一种是直接转化法,不需要回溯,使用一些变量保存中间结果;另一种是间接转化法,需要回溯,使用栈保存中间结果。

(1)直接转化法

将递归结构用循环结构来替代
#include <iostream>
using namespace std;
//二分查找发C++实现
int binarySearch(int a[], int x, int left, int right);//函数声明
int main()
{
	int a[] = {1,2,3,4,5,6,7,8,9};
	int mark = binarySearch(a, 6, 0, sizeof(a)/sizeof(a[0]) - 1);//sizeof(a)/sizeof(a[0])为数组a的长度
	//int mark = binarySearch(a, 11, 0, sizeof(a) / sizeof(a[0]) - 1);//sizeof(a)/sizeof(a[0])为数组a的长度
	if (mark == -1)
		cout << "未查找到" << endl;
	else
		cout << "查找到,下标为:" << mark << endl;
	
}
//数组a从小到大排列
int binarySearch(int a[], int x, int left, int right)
{
	int mid = -1;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (a[mid] == x)
			return mid;
		else if (a[mid] < x)
			left = mid + 1;
		else if (a[mid > x])
			right = mid - 1;
	}
	//while跳出循环时
	return -1;//表示没有找到
}

(2)间接转化法

间接转换法在数据结构中有较多实例,如二叉树遍历算法的非递归实现、图的深度优先遍历算法的非递归实现等。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 11:49:05  更:2021-08-07 11:51:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 14:47:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码