线性表查找

线性表的二分查找 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找的过程如下,先把表中间位置的关键字记录和待查关键字比较,如果两者相等,则查找成功,返回中间位置;否则利用中间位置划分为前后两个子表,如果待查关键字大于中间位置关键字,则进一步查找后一子表,否则查找前一子表。 PTA上的二分查找函数题:... 阅读详情

顺序表的顺序查找&&单链表的顺序查找

//顺序表的顺序查找
template<typename T>
bool SeqSearch(T a[], int n, T target) {
	for (int i = 0; i < n; i++)
	{
		if (a[i] == target)
			return true;
	}
	return false;
}

//单链表的顺序查找
template<typename T>
class Node {
public:
	T data;
	Node* next;
};

template<typename T>
bool LinkSeqSearch(Node<T>* head, T target) {
	Node<T>* p = head->next;
	while (p && p->data != target)
		p = p->next;
	if (p != nullptr)
		return true;
	return false;
}

折半查找

折半查找的精髓就是控制区间的缩小,需要注意的是我的递归做法中区间是左闭右闭的,而非递归方法中区间是左闭右开的,需要注意的是折半查找对数组的要求是有序的。

//折半查找的递归算法
template<typename T>
void recursive(T a[], int left, int right, T target, bool& flag) {
	if (left > right || flag == true) return;//递归结束条件
	int mid = (left + right) / 2;
	if (target < a[mid])
		recursive(a, left, mid - 1, target, flag);
	else if (target > a[mid])
		recursive(a, mid + 1, right, target, flag);
	else if (target == a[mid])
		flag = true;
}

template<typename T>
bool BinarySearch1(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	recursive<T>(a, left, right, target, res);
	return res;
}

//折半查找的非递归算法
template<typename T>
bool BinarySearch2(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	while (left < right)
	{
		if (target < a[mid])
		{
			right = mid;
			mid = (left + right) / 2;
		}
		else if (target > a[mid])
		{
			left = mid + 1;
			mid = (left + right) / 2;
		}
		else if (target == a[mid])
		{
			res = true;
			break;
		}
	}
	return res;
}

全部代码

BasicSearch.h

#pragma once
#ifndef BASICSEARCH_H
#define BASICSEARCH_H
#include<iostream>
using std::cout;
using std::endl;

//顺序表的顺序查找
template<typename T>
bool SeqSearch(T a[], int n, T target) {
	for (int i = 0; i < n; i++)
	{
		if (a[i] == target)
			return true;
	}
	return false;
}

//单链表的顺序查找
template<typename T>
class Node {
public:
	T data;
	Node* next;
};

template<typename T>
bool LinkSeqSearch(Node<T>* head, T target) {
	Node<T>* p = head->next;
	while (p && p->data != target)
		p = p->next;
	if (p != nullptr)
		return true;
	return false;
}

//折半查找的递归算法
template<typename T>
void recursive(T a[], int left, int right, T target, bool& flag) {
	if (left > right || flag == true) return;//递归结束条件
	int mid = (left + right) / 2;
	if (target < a[mid])
		recursive(a, left, mid - 1, target, flag);
	else if (target > a[mid])
		recursive(a, mid + 1, right, target, flag);
	else if (target == a[mid])
		flag = true;
}

template<typename T>
bool BinarySearch1(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	recursive<T>(a, left, right, target, res);
	return res;
}

//折半查找的非递归算法
template<typename T>
bool BinarySearch2(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	while (left < right)
	{
		if (target < a[mid])
		{
			right = mid;
			mid = (left + right) / 2;
		}
		else if (target > a[mid])
		{
			left = mid + 1;
			mid = (left + right) / 2;
		}
		else if (target == a[mid])
		{
			res = true;
			break;
		}
	}
	return res;
}

#endif // !BASICSEARCH_H

SearchHelper.h

#pragma once
#ifndef SEARCHHELPER_H
#define SEARCHHELPER_H

#include<iostream>
#include<ctime>
#include<cassert>
using namespace std;

namespace SortTestHelper {
	//生成n个元素的随机数组
	int* generateRandomArray(int n, int rangeL, int rangeR) {
		assert(rangeL < rangeR);
		int* arr = new int[n];
		srand(time(NULL));//生成随机种子
		for (int i = 0; i < n; i++)
			arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;//rand()返回的是一个随机数		
		return arr;
	}

	template<typename T>
	void testSearch(string searchName, bool(*search)(T[], int, T), T arr[], int n, T target) {//测试不同查找所耗的时间
		clock_t start_time = clock();
		search(arr, n, target);
		clock_t end_time = clock();
		cout << searchName << ":" << double(end_time - start_time) / CLOCKS_PER_SEC << endl;
	}
}


#endif // !SEARCHHELPER_H

main.cpp

#include"BasicSearch.h"
#include"SearchHelper.h"


int main() 
{
	int* a = SortTestHelper::generateRandomArray(1000001, 1, 1000001);
	a[1000000] = 1000022;
	SortTestHelper::testSearch<int>("SeqSearch", SeqSearch<int>, a, 1000001,1000222);
	int b[] = { 1,2,4,6,7,8,9,10,23,32,35,37,38,45,48,50,60,70,112,234,565,4552 };
	int n = sizeof(b) / sizeof(int);
	cout << BinarySearch1<int>(b, n, 0) << endl;
	cout << BinarySearch2<int>(b, n, 0) << endl;
	delete []a;
	return 1;
}

 

数据结构——18. 线性表查找 在深入学习具体的算法之前,我们首先要掌握一些基本术语和概念。这是折半查找的一种改进,更像人类在字典里查单词的方式。这也是折半查找的另一种变体,它利用黄金分割原理。排列时,我们可以使用效率远高于顺序查找的算法。也叫二分查找,是面试和考试的绝对重点。这是最直观、最简单的查找方法。这是对顺序查找的一种优化。 阅读详情

相关推荐

【Linux】常见指令的使用

Linux常用指令

qq_74897518的博客 1479

线性表的查找

查找操作

qq_51691366的博客 3230

霍尔式流量计背后的技术和算法

例如,在一项实验中,当流量低于最小操作范围(0.250 L/min)时,误差比其他流量大,但仍然在95%的精度范围内可接受。例如,在Honeywell电子学的测试中,使用30英寸水柱的压力计和热电偶测量气体特性,记录并计算实际和理论质量流量,以确定修正系数。霍尔式流量计的校准系数是通过一系列精确的测量和计算步骤确定的,以确保其测量结果的准确性和可靠性。霍尔式流量计的校准系数是通过严格的环境条件、精确的测量步骤和实验数据确定的。其中,Qs是标尺介质的流量,K是修正系数,Qm是用户介质的流量。

百态·数智思维 | 聚焦大数据、量化与未来AI 1233

数据结构——线性表的查找

查找查找的概念线性表的查找顺序查找(线性查找)折半查找(二分或对分查找)分块查找 查找的概念 主关键字:可唯一地标识一个记录的关键字就是主关键字 次关键字:用以识别若干记录的关键字就是次关键字 对查找表经常进行的操作: 查询某个“特定的”数据元素是否在查找表中 检索某个“特定的”数据元素的各种属性 在查找表中插入一个数据元素 删除查找表中的某个数据元素 查找表可以分为两类: 静态查找表:   仅作“查询”(检索)操作的查找表 动态查找表:   作“插入”和“删除”操作的查找表   有时在查询之后,还需

Labrador_Katie的博客 5495

【数学建模】 进化计算与群体智能

遗传算法(GA)是一种用于优化和搜索问题的启发式算法。它模拟了自然选择的过程,其中个体通过遗传和变异进行繁殖,逐渐进化出更优的解。基本步骤初始化:生成初始种群。适应度评估:评估种群中每个个体的适应度。选择:根据适应度选择个体进行繁殖。交叉:选定个体对进行基因交换,生成新的后代。变异:对一些个体进行基因变异,以增加多样性。迭代:重复评估和繁殖过程,直至达到停止条件。粒子群优化算法(PSO)是一种基于群体智能的优化算法,由Kennedy和Eberhart于1995年提出。其灵感来源于鸟群觅食的行为。

weixin_42914989的博客 1113

人脸关键点定义汇总

前几天看一份代码临时需要找49个人脸关键点位置定义的图片发现怎么百度都搜不到,最后幸好谷歌可以使用了就用谷歌搜到了。所以在这里汇总一下我所知道的人脸关键点的定义和相关的一点东西,以备不时之需。 68个关键点 最常用的工具是Dlib,网址:http://dlib.net/ dlib的68个特征点检测算法是ERT算法【1】 使用dlib检测68个特征点的python示例见:http://dlib.n...

程序媛 7641

【数据结构线性表查找】——顺序查找和折半查找详解和代码

前言 查找的定义是:给定一个值k,在含有n个记录的表中找出关键字等于k的记录。若找到,则查找成功,返回该记录的信息或该记录在表中的位置;否则查找失败,返回相关的指示信息。 采用哪一种查找方法,需要考虑两点       (1)使用哪种数据结构来表示“表”;       (2)是对无序集合查找还是对有序集合查找。 线性表 三种在线性表上进行查找的方法:      (1)顺序查找

牧之 1万+

Win10插网线显示未识别网络的三种解决方法

本文介绍了三种解决Win10插网线显示未识别网络问题的方法:更新或重启网络设备驱动程序、重置Winsock目录、启用Network Setup Service服务。这些方法都是基于常见的网络问题和解决方案而设计的,适用于大多数Win10用户。如果你遇到了这一问题,可以按照上述步骤进行操作,相信一定能够找到解决问题的方法。需要注意的是,在进行任何操作之前,请务必备份重要数据以防万一。此外,如果你对计算机硬件或软件不熟悉,建议寻求专业人士的帮助以避免造成不必要的损失。

nntxthml的博客 6770

基于线性表的查找

【代码】基于线性表的查找。

m0_63783532的博客 1093

高比例风电电力系统储能运行及配置研究(python&Matlab实现)

目录1 概述2 案例3 Matlab实现 3.1 题目及分析3.2 Matlab代码 4 七个题全部代码(值得学习) 下面我们先以第二题为例,然后给出Matlab代码:先考虑风电装机300MW直接替代机组3的发电功率曲线,观察系统功率平衡发生的变化情况。然后在此场景下,以最小发电成本为目标函数,将负荷分配给两台火电机组1、2和风电机组,绘制机组日发电计划图。再将风电装机容量作为一个决策变量,以最小发电成本为目标函数,求取最小发电成本对应的风电装机容量,绘制机组日发电计划图。1. 风电装机300MW、直接

weixin_46039719的博客 1738

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 125

查找:线性表的C语言代码实现(顺序查找、折半查找)

目录 一、线性表结构 两个类的定义 二、线性表的初始化以及根据输入的元素建立线性表 1.线性表的初始化,初始化一个空的线性表 2.根据用户需求,向线性表中添加元素 三、顺序查找 Search1函数(没有设置哨兵,需要比较两次) 四、顺序查找(设置哨兵,不用再比较是否会越界,只用比较一次)Search2函数 五、折半查找(非递归)Search3函数 六、折半查找(递归)Search4函数 七、显示输出函数 Show函数

weixin_52375817的博客 1万+

互联网人提高效率必备软件合集

很多的时候我们解决不了问题,只是因为没有找到对的工具,实际上,很多好的工具就在那里,只是你不用而已。这点上,信息壁垒是一个很大的原因,因此我希望兄伙伴们多出去走走,不要只是局限在一个圈层;

zhonglunshun的专栏 3484

查找算法之线性表查找

一  基本概念 查找表:由同一类型的数据元素构成的集合。 静态查找表:支持的操作:(1)查询特定的元素是否在查找表中。(2)检索某个特定的元素的各种属性。(1)(2)操作统称为“查找”操作。 动态查找表:在进行查找的操作时候,同时插入不存在的元素,或者删除表中已经存在的元素。 平均查找长度(ASL):对关键字需要执行的平均比较次数作为衡量查找算法效率的标准。 二 线性表查找算法

2486

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

(详解)数据结构线性表的查找——顺序查找、折半查找、分块查找

在本文中,我们详细讨论了数据结构线性表的查找算法,包括顺序查找、折半查找和分块查找。这些算法在不同的应用场景和数据特性下有着各自的优势和局限性。

StarPrayers.的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

线性表的查找算法-C语言

了解查找的基本概念,理解顺序查找、折半查找和分块查找的思想,掌握折半查找过程的判定树构造方法,实现线性表的查找算法。

小北的博客 7175

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

查找——线性表顺序查找算法

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 线性表顺序查找算法.cpp *作 者: 郑兆涵 *查找——线性表顺序查找算法 */ 问题:对线性表顺序查找算法进行分析 编程代码: //线性表顺序查找算法 #include #define MAXL 100 typedef int KeyTy

Henry's Blog 1万+

查找——查找的基本概念,线性表之顺序查找

本篇文章主要介绍查找的基本概念,线性表中的顺序查找算法分析。

Blusher1的博客 1189

查找——线性表的折半法查找

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 线性表的折半法查找.cpp *作 者: 郑兆涵 *查找——线性表的折半法查找 */ 问题:分析线性表的折半法查找 编程代码: //线性表的折半法查找 #include #defin

Henry's Blog 3161

C语言|线性表的查找算法|顺序查找、索引查找

线性表的查找算法ASLASLASL的定义顺序查找基本思想及查找算法查找性能索引查找索引表的构建索引表的顺序查找算法查找性能 查找算法涉及两个主要问题:一是数据如何组织——查找表;而是在查找表上如何查找——查找方法。 查找过程中往往是依据数据元素的某个数据项进行 的,这个数据项通常是数据的关键字。可以唯一确定一个数据元素的关键字称为主关键字,不能唯一确定一个数据元素的关键字称为次关键字。常用的查找方法主要有顺序查找、索引查找和哈希查找。 ASLASLASL的定义 在进行查找性能的分析时。经常采用平均查找长度

weixin_48709737的博客 3247

【查找算法概念】与【线性表的相关查找算法】

以查找21成功为实例:中点值大于key,缩短上半区间中间值小于key,缩短下半区间找到key值以非递减有序排列。

2401_82676816的博客 1284

线性表查找(顺序查找,二分查找)

1、顺序查找(无序) 2、折半查找(必须是有序数组) 实现代码(java) public class lineSearch { //测试代码 public static void main(String[] args) { //顺序查找 int[] arr1 = {34,76,23,98,87,35,8,32,74,44}; int ...

Anna4的博客 1839
上一篇: 邻接矩阵构造图C++实现
下一篇: 二叉排序树C++实现
-Gentle-
博客等级 码龄8年 80粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值