当前位置: 首页 > news >正文

数据结构-查找与排序

数据结构再往后就是比较零散的各种操作,查找与排序是其中最常出现的,今天来总结一下常用的查找与排序所用的方法

查找

顺序查找
  • 最简单的查找方式,遍历,然后比较
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);//调整剩余元素构建最大堆}
}

相关文章:

数据结构-查找与排序

数据结构再往后就是比较零散的各种操作&#xff0c;查找与排序是其中最常出现的&#xff0c;今天来总结一下常用的查找与排序所用的方法 查找 顺序查找 最简单的查找方式&#xff0c;遍历&#xff0c;然后比较 bool search1(int *a,int n,int k){for (int i1;i<n;i){//遍…...

【前端素材】推荐优质后台管理系统Qovex平台模板(附源码)

一、需求分析 1、定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心&#xff0c;管理员可以通过后台系统进行各种管理…...

MATLAB环境下基于短时傅里叶变换和Rényi熵的脑电信号和语音信号分析

傅里叶变换是不能很好的反映信号在时域的某一个局部范围的频谱特点的&#xff0c;这一点很可惜。因为在许多实际工程中&#xff0c;人们对信号在局部区域的特征是比较关心的&#xff0c;这些特征包含着十分有用的信息。这类信号因为在时域(或者是空间域)上具有突变的非稳定性和…...

Go语言调用身份证实名认证API方法-标准版身份证实名认证接口

翔云身份证实名认证接口具备高准确度的身份信息比对能力&#xff0c;包括姓名、身份证号码、人脸照片等信息的一致性验证&#xff0c;并能实时反馈验证结果。 以下是GO语言调用翔云身份实名认证API的代码&#xff1a; package mainimport ("fmt""bytes"&q…...

数据库增删改查

DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库用户、控制数…...

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…...

echrts 全国地图、各省市地图json文件下载

DataV.GeoAtlas地理小工具系列...

如何使用1688.item_search_shop API获取阿里巴巴店铺商品信息

要使用1688的item_search_shop API获取阿里巴巴店铺的商品信息&#xff0c;你通常需要遵循以下步骤&#xff1a; 1. 注册并获取API密钥 首先&#xff0c;你需要在阿里巴巴开放平台&#xff08;如1688开放平台&#xff09;上注册一个开发者账号&#xff0c;并创建一个应用。创…...

PLC_博图系列☞基本指令“取反RLO”

PLC_博图系列☞基本指令“取反RLO” 文章目录 PLC_博图系列☞基本指令“取反RLO”背景介绍取反RLO说明示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 取反RLO 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的博图软件。我并不是专业的PLC…...

docker安装PostGIS扩展

去docker仓库查找你想要安装的镜像版本&#xff0c;并pull下来 我下载的版本&#xff1a; [rootlocalhost ~]# docker pull postgis/postgis:12-3.2运行容器 [rootlocalhost ~]# docker run --name postgis --privilegedtrue --restartalways -e POSTGRES_USER12345678 -e P…...

LabVIEW开发FPGA的高速并行视觉检测系统

LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展&#xff0c;视觉检测在生产线中扮演着越来越重要的角色&#xff0c;尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性&#xff0c;难以满足当前生产需求的高速和高精度要求。为此&#xf…...

P5734 【深基6.例6】文字处理软件 - Java

题目描述 你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 00 个字符。需要支持以下操作&#xff1a; 1 str&#xff1a;后接插入&#xff0c;在文档后面插入字符串 strstr&#xff0c;并输出文档的字符串&#xff1b;2 a b&#xff…...

关于设备连接有人云的使用及modbus rtu协议,服务器端TCP调试设置

有人云调试 调试过程问题1. 关于modbus rtu协议,实质上有三种modbus基本原理modbus 格式2. 关于modbus crc16通信校验3. 关于在ubuntu阿里云服务器端,监听网络数据之调试mNetAssist4. 使用有人FAE传给的设置软件问题???之前的一个项目,再拿出来回顾下。 调试过程 先 要在有…...

开源图表库Echarts 简介与基本使用

ECharts 是一个使用 JavaScript 实现的开源可视化图表库&#xff0c;由百度团队开发。它提供了丰富的图表类型&#xff0c;如折线图、柱状图、饼图、地图、雷达图等&#xff0c;并且可以轻松地与其他前端框架和库集成。ECharts 的设计目的是为了满足复杂数据的可视化需求&#…...

变更ip后怎么查现在的代理ip地址?代理IP在网络请求中有哪些优势?

要查看当前的代理IP地址&#xff0c;可以尝试以下方法 浏览器设置&#xff1a;在大部分浏览器中&#xff0c;可以通过菜单选项中的“设置”或“帮助”来查找关于代理服务器的设置。在这里&#xff0c;可以看到当前使用的代理服务器地址、端口号以及是否启用了代理服务。在线工具…...

C#浮点运算出错问题

在计算单价等活动的时候&#xff0c;我们经常会用到double 浮点进行运算&#xff0c;但是在乘除的时候经常出现精度丢失问题 decimal 关键字表示 128 位数据类型。 同浮点型相比&#xff0c;decimal 类型具有更高的精度和更小的范围&#xff0c;这使它适合于财务和货币计算 dou…...

WPF 控件禁用时,显示悬浮提示

WPF 控件禁用时&#xff0c;显示悬浮提示 控件在禁用状态下&#xff0c;按钮是没有悬浮提示信息的&#xff0c;是事件触发的机制&#xff1b; 如果要禁用下也有悬浮提示&#xff0c;可以在控件外面加一层&#xff0c;例如&#xff1a; <Border Grid.Column"1" To…...

在 Windows 上使用 VC++ 编译 OpenSSL 源码的步骤

在 Windows 上使用 VC 编译 OpenSSL 源码的步骤如下&#xff1a; 准备工作 安装 Visual Studio 2017 或更高版本。安装 Perl 脚本解释器。安装 NASM 汇编器。 编译步骤 下载 OpenSSL 源码。解压 OpenSSL 源码。打开命令行工具&#xff0c;并进入 OpenSSL 源码目录。运行以下…...

【MySQL】解决在join表时一对多的情况下重复数据的问题

在MySQL中进行JOIN操作&#xff0c;特别是在处理一对多关系的表时&#xff0c;可能会出现重复的记录&#xff0c;这是因为左表&#xff08;或右表&#xff09;中的每一项在与右表&#xff08;或左表&#xff09;连接时&#xff0c;如果对应有多条匹配记录&#xff0c;则会生成多…...

高并发Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上&#xff0c;服务端server接收到IO请求后&#xff0c;是如何处理请求并最终进入业务流程的呢&#xff1f;这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…...

Linux安全基线与加固

基于CIS 基线 GitHub - daniel-armbrust/linux-security-baseline: Linux Security Baseline based on CIS Benchmarks. |----------------[ GNU/Linux安全基线与加固-0.3 ]----------------|0. About this doc1. Routine security baseline1.1 Security fix update1.2 Pass…...

应对电脑重新分区文件消失:预防措施、常见成因与恢复关键要点

电脑重新分区文件不见了是一个常见的问题&#xff0c;通常发生在用户对硬盘进行重新分区、格式化或操作系统重装过程中&#xff0c;可能导致已存在的文件和数据暂时不可见或永久丢失。 **预防文件丢失的方法&#xff1a;** 1. **提前备份**: 在进行任何重大磁盘操作前&#xff…...

本地配置多个git账户及ll设置

本地配置多个git账户 清除全局配置将命令行&#xff0c;切换到ssh目录生成GitLab和Gitee的公钥、私钥去对应的代码仓库添加 SSH Keys添加私钥ll设置 管理密钥验证仓库配置关于gitgitee.com: Permission denied (publickey) 清除全局配置 此步骤可以不做&#xff0c;经测试不影…...

week04day04(爬虫)

一. 嵌套构造URL 下载所有英雄的皮肤图片&#xff1a;因为每个英雄图片的网址不同&#xff0c;但是有共同点&#xff0c;通过构建这个网址&#xff0c;再经过循环建立 所有链接 import requests import os# 1. 获取所有英雄的ID def get_all_hero_id():url https://game.gti…...

【数据结构初阶 6】二叉树:堆的基本操作 + 堆排序的实现

文章目录 &#x1f308; Ⅰ 二叉树的顺序结构&#x1f308; Ⅱ 堆的概念与性质&#x1f308; Ⅲ 堆的基本操作01. 堆的定义02. 初始化堆03. 堆的销毁04. 堆的插入05. 向上调整堆06. 堆的创建07. 获取堆顶数据08. 堆的删除09. 向下调整堆10. 判断堆空 &#x1f308; Ⅳ 堆的基本…...

IDEA Debug框的 show execution point按钮没了

在这里右键&#xff1a; Add Action&#xff1a; 搜索添加&#xff1a; 本文由博客一文多发平台 OpenWrite 发布&#xff01;...

突破编程_C++_面试(类(1))

面试题 1 &#xff1a;解释一下 C 中的类是什么&#xff0c;它有哪些基本特性&#xff1f; C 中的类&#xff08;class&#xff09;是面向对象程序设计的基本构成单位&#xff0c;它是一种自定义的数据类型&#xff0c;用于封装数据以及操作这些数据的方法。类是创建对象的模板…...

vue项目使用vue2-org-tree

实现方式 安装依赖 npm i vue2-org-tree使用的vue页面引入 <template><div class"container"><div class"oTree" ><vue2-org-tree name"test":data"data":horizontal"horizontal":collapsable"…...

Vue30 自定义指令 函数式 对象式

实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>自定义指令</title><script type"text/javascript" src"../js/vue.js"></script></head><body><!-- 需求1&…...

JAVA高并发——单例模式和不变模式

文章目录 1、探讨单例模式2、不变模式 由于并行程序设计比串行程序设计复杂得多&#xff0c;因此我强烈建议大家了解一些常见的设计方法。就好像练习武术&#xff0c;一招一式都是要经过学习的。如果自己胡乱打&#xff0c;效果不见得好。前人会总结一些武术套路&#xff0c;对…...