数据结构-查找与排序
数据结构再往后就是比较零散的各种操作,查找与排序是其中最常出现的,今天来总结一下常用的查找与排序所用的方法
查找
顺序查找
- 最简单的查找方式,遍历,然后比较
bool search1(int *a,int n,int k){for (int i=1;i<n;i++){//遍历if (a[i]==k) {//比较return true;break;}}return false;
}
遍历时对数据i是否越界的判断可以使用哨兵优化掉
int search1(int *a,int n,int k){a[0]=key;//哨兵while(a[n]!=key){n--;}return n;//找到返回位置,找不到返回0
}
二分查找
- 又称为折半查找,是对顺序表进行的一种查找方式,每次查找过后,如果目标值小于中间值,则肯定小于中间向右的所有值,只需要在左边数据里查找;再对中间值进行比较,如此反复
//二分查找
int binarysearch(int *a,int n,int k){int l,r,m;l=1;//左指针指向一查找的数组范围的左边r=n;//右指针while(l<=r){m=(l+r)/2;if (a[m]==k) return m;//如果相等,返回找到的位置else if(a[m]>k) r=m-1;//在左边进行查找else l=m+1;//在右边查找}return 0;
}
插值查找
- 与二分查找类似的查找方式,不同的是每次更新查找域并不是对半分,而是根据目标值与最小值的估计距离,(如果差值大查找域就更往右,反之往左),m=l+(r-l)*(k-a[l])/(a[r]-a[l])
//插值查找
int intersearch(int* a,int n,int k){int l,r m;l=1;r=n;while(l<=r){m=l+(r-l)*(k-a[l])/(a[r]-a[l]);if (a[m]==k) return m;//如果相等,返回找到的位置else if(a[m]>k) r=m-1;else l=m+1;}return 0;
}
斐波那契查找
- 基于斐波那契数列独有的黄金分割性质进行的查找,原理与二分查找类似,不同点依旧是对二次查找域的分割不是基于一半,而是基于黄金分割

//斐波那契查找
//f[k]为斐波那契数列
int fibosearch(int* a,int n,int k){int l,r,m;l=1;r=n;while(n>f[k]-1){k++;}for (int i=n;i<f[k]-1;i++){//补全a数组,将最大的数补到a数组后面a[i]=a[n];}while(l<=r){m=l+f[k-1]-1;if (a[m]==k) {if (m>n) return n;//m大于n,说明是补全的数字中的值与目标值相等,返回最大值else return m;}else if(a[m]>k){//此时去左边查找,新数列的总长度为f[k-1]-1个r=m-1;k--;}else {//此时去右边查找,新数列的总长度为f[k-2]-1个l=m+1;k-=2;}}return 0;
}
二叉树的查找操作
- 在BST中查找对应值。简单的树状遍历查找
bool search(BinaryTree* T,int key) {if (!T) {return false; //树为空} else if (key==T->data) {return true;//查找成功} else if (key<T->data) {return search(T->leftchild,key); //继续在左子树中查找} else {return search(T->rightchild,key); //向在右子树中查找}
}
排序
插入排序
- 插入排序是将数组分为排好序与未排序的部分,在未排序部分取出元素,比较插入到已排序的部分的合适位置,一般看做第一个元素已排序完毕,从第二个元素开始,对已排序部分从前往后扫描,已排序的元素中大于此元素的向后移动,如此反复
void inserSort(int*a,int n) {for (int i=1;i<n;i++) {//从第二个元素开始比较,找合适的位置插入int k=a[i];int j=i-1;// 将a[i]插入到已排序序列数组中while (j>=0&&a[j]>k) {a[j+1]=a[j];j--;}a[j+1]=k;}
}
冒泡排序
- 这个方法几乎是新手村必打的小怪。重复遍历数组,一次比较两个元素,如果顺序不对就交换它们
void bubbleSort(int *a, int n) {for (int i=0; i<n-1; i++) {for (int j=0; j<n-i-1; j++) {if (a[j]>a[j+1]) {//顺序不对则交换int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}
}
希尔排序
- 希尔排序是对插入排序的一种改进,通过比较不相邻的元素进行交换来提高插入排序的效率。基本思想为将数组分为若干子序列,对每个子序列进行插入排序,再对这个数列进行插入排序
void shellSort(int *a, int n) {for (int gap=n/2;gap>0;gap/=2) {//对不同步长进行排序(即不同长度子序列)for (int i=gap; i<n; i++) {int temp=a[i];//记录当前元素int j;for (j=i;j>=gap&&a[j-gap]>temp;j-=gap) {a[j]=a[j-gap];//往后移动元素}a[j]=temp;//插入到正确位置}}
}
快速排序
- 快排采用了分治法的思想,选择一个基准元素,将待排数组分为两个部分,左边都小于它,右边都大于它,然后递归地进行排序
- 具体方法为:选择基准元素(一般为第一个元素),设定左右指针指向数组始末;
- 移动左指针,直到找到小于基准元素的元素,同时移动右指针,找到大于基准元素的元素,交换这两个元素的位置;重复步骤,直到左指针大于右指针
- 将基准元素与右指针的元素互换,此时基准元素左边的都小于等于它,右边的大于等于它;
- 重复以上步骤
int partition(int*nums,int low,int high) {int pivot=nums[low];//选择第一个元素为基准元素while (low<high) {// 从右向左找到小于基准元素的值while (low<high&&nums[high]>=pivot)high--;nums[low]=nums[high];//将找到的小于基准元素的值放到左边// 从左向右找到大于基准元素的值while (low<high&&nums[low]<=pivot)low++;nums[high]=nums[low];//将找到的大于基准元素的值放到右边}nums[low]=pivot;return low;
}
void qsort(int*nums,int low,int high) {if (low<high) {int pos=partition(nums,low,high);//获取基准元素位置qsort(nums,low,pos-1);//对左半进行排序qsort(nums,pos+1,high);//对右半进行排序}
}
堆排序
- 堆排序是一种基于堆形数据结构的排序,利用堆的性质来实现。堆分为最大堆和最小堆,分别是父结点大于子节点、父结点小于子节点的二叉树结构
- 堆排序是先将待排数组构成一个最大堆或最小堆,然后每次取出堆顶元素,对剩下的元素进行调整,再继续取出,直到所有元素被取出
(c++有堆形数据结构的相关函数,使用其排序较为方便)
void print(const vector<int>& a) {//输出排序好的元素for (int i=0;i<a.size();i++)cout<<a[i]<<" ";cout<<endl;
}
// 堆排序
void heapSort(vector<int>& a) {make_heap(a.begin(),a.end());//默认构建最大堆,最小堆需要自定义比较函数for (int i=a.size()-1;i>0;i--) { //依次取出堆顶元素,进行排序pop_heap(a.begin(),a.begin()+i+1);//将当前堆顶元素(最大值)与数组末尾元素交换swap(a[0],a[i]);push_heap(a.begin(),a.begin()+i);//调整剩余元素构建最大堆}
}
相关文章:
数据结构-查找与排序
数据结构再往后就是比较零散的各种操作,查找与排序是其中最常出现的,今天来总结一下常用的查找与排序所用的方法 查找 顺序查找 最简单的查找方式,遍历,然后比较 bool search1(int *a,int n,int k){for (int i1;i<n;i){//遍…...
【前端素材】推荐优质后台管理系统Qovex平台模板(附源码)
一、需求分析 1、定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作,用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心,管理员可以通过后台系统进行各种管理…...
MATLAB环境下基于短时傅里叶变换和Rényi熵的脑电信号和语音信号分析
傅里叶变换是不能很好的反映信号在时域的某一个局部范围的频谱特点的,这一点很可惜。因为在许多实际工程中,人们对信号在局部区域的特征是比较关心的,这些特征包含着十分有用的信息。这类信号因为在时域(或者是空间域)上具有突变的非稳定性和…...
Go语言调用身份证实名认证API方法-标准版身份证实名认证接口
翔云身份证实名认证接口具备高准确度的身份信息比对能力,包括姓名、身份证号码、人脸照片等信息的一致性验证,并能实时反馈验证结果。 以下是GO语言调用翔云身份实名认证API的代码: package mainimport ("fmt""bytes"&q…...
数据库增删改查
DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库用户、控制数…...
10.CSS3的calc函数
CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗? CSS3 中的 calc 函数 calc 是英文单词 calculate(计算)的缩写,是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处,语法如…...
echrts 全国地图、各省市地图json文件下载
DataV.GeoAtlas地理小工具系列...
如何使用1688.item_search_shop API获取阿里巴巴店铺商品信息
要使用1688的item_search_shop API获取阿里巴巴店铺的商品信息,你通常需要遵循以下步骤: 1. 注册并获取API密钥 首先,你需要在阿里巴巴开放平台(如1688开放平台)上注册一个开发者账号,并创建一个应用。创…...
PLC_博图系列☞基本指令“取反RLO”
PLC_博图系列☞基本指令“取反RLO” 文章目录 PLC_博图系列☞基本指令“取反RLO”背景介绍取反RLO说明示例 关键字: PLC、 西门子、 博图、 Siemens 、 取反RLO 背景介绍 这是一篇关于PLC编程的文章,特别是关于西门子的博图软件。我并不是专业的PLC…...
docker安装PostGIS扩展
去docker仓库查找你想要安装的镜像版本,并pull下来 我下载的版本: [rootlocalhost ~]# docker pull postgis/postgis:12-3.2运行容器 [rootlocalhost ~]# docker run --name postgis --privilegedtrue --restartalways -e POSTGRES_USER12345678 -e P…...
LabVIEW开发FPGA的高速并行视觉检测系统
LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展,视觉检测在生产线中扮演着越来越重要的角色,尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性,难以满足当前生产需求的高速和高精度要求。为此…...
P5734 【深基6.例6】文字处理软件 - Java
题目描述 你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 00 个字符。需要支持以下操作: 1 str:后接插入,在文档后面插入字符串 strstr,并输出文档的字符串;2 a bÿ…...
关于设备连接有人云的使用及modbus rtu协议,服务器端TCP调试设置
有人云调试 调试过程问题1. 关于modbus rtu协议,实质上有三种modbus基本原理modbus 格式2. 关于modbus crc16通信校验3. 关于在ubuntu阿里云服务器端,监听网络数据之调试mNetAssist4. 使用有人FAE传给的设置软件问题???之前的一个项目,再拿出来回顾下。 调试过程 先 要在有…...
开源图表库Echarts 简介与基本使用
ECharts 是一个使用 JavaScript 实现的开源可视化图表库,由百度团队开发。它提供了丰富的图表类型,如折线图、柱状图、饼图、地图、雷达图等,并且可以轻松地与其他前端框架和库集成。ECharts 的设计目的是为了满足复杂数据的可视化需求&#…...
变更ip后怎么查现在的代理ip地址?代理IP在网络请求中有哪些优势?
要查看当前的代理IP地址,可以尝试以下方法 浏览器设置:在大部分浏览器中,可以通过菜单选项中的“设置”或“帮助”来查找关于代理服务器的设置。在这里,可以看到当前使用的代理服务器地址、端口号以及是否启用了代理服务。在线工具…...
C#浮点运算出错问题
在计算单价等活动的时候,我们经常会用到double 浮点进行运算,但是在乘除的时候经常出现精度丢失问题 decimal 关键字表示 128 位数据类型。 同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算 dou…...
WPF 控件禁用时,显示悬浮提示
WPF 控件禁用时,显示悬浮提示 控件在禁用状态下,按钮是没有悬浮提示信息的,是事件触发的机制; 如果要禁用下也有悬浮提示,可以在控件外面加一层,例如: <Border Grid.Column"1" To…...
在 Windows 上使用 VC++ 编译 OpenSSL 源码的步骤
在 Windows 上使用 VC 编译 OpenSSL 源码的步骤如下: 准备工作 安装 Visual Studio 2017 或更高版本。安装 Perl 脚本解释器。安装 NASM 汇编器。 编译步骤 下载 OpenSSL 源码。解压 OpenSSL 源码。打开命令行工具,并进入 OpenSSL 源码目录。运行以下…...
【MySQL】解决在join表时一对多的情况下重复数据的问题
在MySQL中进行JOIN操作,特别是在处理一对多关系的表时,可能会出现重复的记录,这是因为左表(或右表)中的每一项在与右表(或左表)连接时,如果对应有多条匹配记录,则会生成多…...
高并发Server的基石:reactor反应堆模式
业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
