查找和排序

目录

一、查找

1.1查找的基本概念

1.2顺序查找

1.3折半查找(二分查找)

1.4散列表的查找

1.4.1基本概念

1.4.2散列函数的构造方法

1.4.3解决冲突的方法

二、排序

2.1排序的基本概念

2.2插入排序

2.2.1直接插入排序:

2.2.2希尔排序

2.3交换排序

2.3.1冒泡排序

2.3.2快速排序


一、查找

1.1查找的基本概念

①查找:在数据集合中,寻找满足魔偶找条件的数据元素的过程。

②查找表(查找结构):用于查找的数据集合

③关键字:数据元素中某个数据项的值,用它可以标识一个数据元素;

主关键字:关键字可以唯一地标识一个记录。

④平均查找长度:所有查找过程中进行的关键字的比较次数的平均值

ASL=\sum(Pi·Ci)

1.2顺序查找

基本思想:

从线性表的一端开始,逐个检查关键字是否满足给定的条件。若查找到某个元素的关键字满足条件,则查找成功,返回该元素在线性表中的位置。若查找到表的另一端,仍未找到符合给定条件的元素,则返回查找失败的信息。

算法实现:

typedef struct{ElemType *elem;int TableLen;
}SSTable;
int Search_Sep(SSTable ST,ElemType key){ST.elem[0]=key;for(i=ST.TableLen;ST.elem[i]!=key;--i); //从后往前查找return i;
} 

注:对线性链表只能进行顺序查找。

1.3折半查找(二分查找)

仅适用于有序的顺序表

算法实现:

int Binary_Search(SeqList L,ElemType key){int low=0,high=L.TableLen-1,mid;while(low<=high){mid=(low+high)/2;if(L.elem[mid]==key)return mid;else if(L.elem[mid]>key)high=mid-1;elselow=mid+1;}
}

 时间复杂度为O(n)=log2(n)

1.4散列表的查找

1.4.1基本概念

散列函数:Hash(key)=Addr

同义词:散列函数可能会把两个或两个以上的不同关键字映射到同一地址。

例3%4=3,7%4=3,3和7为同义词

1.4.2散列函数的构造方法

①直接定址法:H(key)=key H(key)=a*key+b

②除留余数法: m,取一个不大于但最接近或等于m的质数p

③数字分析法

④平方取中法

1.4.3解决冲突的方法

①开放定址法:可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。其数学递推公式为:Hi=(H(key)+di)%m

对di的取法:

a.线性探测法:di=0,1,2,...,m-1

b.平方探测法:di=0*0,1*1,-1*(-1),2*2,-2*(-2),....k*k,-k*(-k) ,k<=m/2

c.再散列法:di=Hash2(key)

例:散列表的构造

②拉链法:为了避免非同义词发生冲突,把所有的同义词存储在一个线性链表中

注:散列表的查找长度取决于3个因素:散列函数、处理冲突的方法、装填因子

装填因子\alpha=表中记录数n/散列长度m

散列表的平均查找长度依赖于装填因子\alpha,不直接依赖于n或m,\alpha越大时,表示装填的记录越满,发生冲突的可能性就越大。

二、排序

2.1排序的基本概念

①排序:重新排列表中的元素,使表中的元素满足按关键字有序。

②稳定性,在排序前后序列中的Ri始终领先于Rj,则称所用的排序方法时稳定的(考虑相对位置)

③内部排序:指在排序期间元素全部存在内存中的排序

方法:插入排序、交换排序、选择排序、归并排序和基数排序(前四种需要经过比较和移动两种操作)

④外部排序:指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断地在内,外存之间移动的排序。

2.2插入排序

基本思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。

2.2.1直接插入排序:

算法实现:

void InsertSort(ElemType A[[],int n){int i,j;for(i=2,i<=n;i++)if(A[i]<A[i-1]){A[0]=A[i];for(j=i-1;A[0]<A[j];--j)A[j+1]=A[j];A[j+1]=A[0];}
}

空间复杂度:O(1); 时间复杂度:O(n*n); 稳定性:稳定

2.2.2希尔排序

把像个某个增量的记录组成一个子表,对各个子表分别进行直接插入排序,当整个表中的元素已呈基本有序时,再对全体记录进行依次直接插入排序。

空间复杂度:O(1); 时间复杂度不确定;稳定性:不稳定

例:

2.3交换排序

2.3.1冒泡排序

基本思想:从后往前(或从前往后)两两比较相邻元素的值,若为逆序,则进行交换,直到序列比较完,第一趟冒泡结束,结果是将最小的元素交换到待排序列的第一个位置(或将最大的元素交换到待排序列的最后一个位置)。

算法实现:

void BubbleSort(ElemType A[], int n){for(i=0;i<n-1;i++)flag=false;for(j=n-1;j>i;j--)if(A[j-1]>A[j]{swap(A[j-1],A[j]);flag=true;}if(flag==false)return;} 

空间复杂度:O(1); 时间复杂度:O(n*n) ; 稳定性:稳定

2.3.2快速排序

基本思想:在待排序表L[1....,n]中任取一个元素pivot作为枢轴,(通常取首元素),通过一趟快速排序将待排序表划分为独立的两部分L[1,,,k-1]和L[k+1...n],pivot放在了最终位置L[k]中

空间复杂度:O(log2(n)); 时间复杂度:O(nlog2(n)); 稳定性:不稳定

·快速排序是所有内部排序算法中平均性能最优的排序算法,但它并不适用于原本有序或基本有序的记录序列进行排序。

2.4选择排序

2.4.1简单选择排序

基本思想:假设排序表为L[1....,n],第i趟排序即从L[i...,n]中选择关键字最小的元素与L[i]交换

 

void SelectSort(ElemType A[],int n){for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++)if(A[j]<A[min]min=j;if(min!=i)swap(A[i],A[min]);}
}

空间复杂度:O(1);  时间复杂度:O(n*n) ;  稳定性:不稳定

2.4.2堆排序

 构造大根堆:双亲结点大于孩子结点

 堆的删除操作

堆的插入操作

空间复杂度: O(1);  时间复杂度:O(nlog2(n));  稳定性:不稳定

2.4归并排序

“归并”是将两个或两个以上的有序表组合成一个新的有序表。

2.4.1 2路归并排序

空间复杂度:O(n);  时间复杂度:O(nlog2(n)); 稳定性:稳定

2.5基数排序

基数排序不基于比较和移动进行排序,而基于关键字各位的大小排序。

①对个位进行排序

②对十位进行排序

③对百位进行排序

空间复杂度:O(r);时间复杂度:O(d(n+r)),d表示分配和收集的趟数;稳定性:稳定

2.6各种排序算法的比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 简单使用 sftp 和 lftp命令

目录 一. 环境准备二. sftp命令连接到SFTP服务器三. lftp命令3.1 连接FTP和SFTP服务器3.2 将文件从sftp服务器下载到本地指定目录 四. 通过WinSCP命令行从SFTP服务器获取文件到Windows 一. 环境准备 ⏹在安卓手机上下载个MiXplorer&#xff0c;用作SFTP和FTP服务器 官网: htt…

windows无法启动redis-server

Warning: no config file specified, using the default config. In order to specify a config file use D:\Code_enve\Redis\redis-server.exe /path/to/redis.conf Creating Server TCP listening socket *:6379: bind: No such file or directory以上是问题的报错信息&…

AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读

Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 论文:https://arxiv.org/pdf/2311.17117 网页:https://humanaigc.github.io/animate-anyone/ MOTIVATION 角色动画的目标是将静态图像转换成逼真的视频&#xff0c;这在在线零…

计网:网络应用层【Email应用/SMTP协议】

Email应用与SMTP协议 Email应用层的构成 客户端服务器协议 用户代理 用于读写邮件消息&#xff1b;与服务器交互&#xff0c;收发邮件消息 常见的客户端&#xff1a;Outlook&#xff0c;Foxmail&#xff08;这两个是需要下载的客户端&#xff09;&#xff0c;Web客户端&…

【论文复现|智能算法改进】一种基于多策略改进的鲸鱼算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现【附完整Matlab代码】 2.改进点 混沌反向学习策略 将混沌映射和反向学习策略结合&#xff0c;形成混沌反向学习方法&#xff0c;通过该方 法…

VB实现加法计算

textbox1失去焦点&#xff0c;检查输入的值是否为数字。 textbox2中按下Enter键&#xff0c;检查输入的值是否为数字。 textbox3获得焦点&#xff0c;计算textbox1和textbox2的和。 Public Class Form1Private Sub TextBox1_LostFocus(sender As Object, e As EventArgs) Hand…

基于Django + Web + MySQL的智慧校园系统

基于Django Web MySQL的智慧校园系统 由于时间紧迫&#xff0c;好多功能没实现&#xff0c;只是个半吊子的后台管理系统&#xff0c;亮点是项目安全性还算完整&#xff0c;权限保护加密功能检索功能有实现&#xff0c;可参考修改 功能如下&#xff08;服务为超链接&#xff0…

yii2 ActiveForm使用技巧

持续更新&#xff1a; 1、搜索输入框&#xff1a;form-inline <?php $form ActiveForm::begin([action > [index],method > get,options > [class > form-inline] &#xff08;增加此行代码&#xff09; ]); ?>

PBR网络数据流量分流+NQA联动静态路由

一、实验目的&#xff1a; 企业有两个网段&#xff0c;业务1网段和业务2网段&#xff0c;拓扑图如下&#xff0c; 二、实验要求 pc1报文走左侧链路到达ar1&#xff0c;pc2报文走右侧链路到达ar1&#xff0c;且当ar2或者ar3发生故障时候&#xff0c;可以通过另一个设备到达ar1…

1.4 Kettle 数据同步工具详细教程

工具介绍 一、概述 Kettle&#xff0c;又名 Pentaho Data Integration&#xff08;PDI&#xff09;&#xff0c;是一个开源的数据集成工具&#xff0c;最初由 Pentaho 公司开发。它能够从多种数据源提取、转换并加载&#xff08;ETL&#xff09;数据&#xff0c;适用于数据仓…

字符串根据给定关键词进行高亮显示

问题 一般使用搜索引擎的时候我们会发现,搜索出来的内容都对我们搜索的关键词进行了高亮显示, 这样我们能很直观的看出是不是我们想要的结果, 最近我也遇到了类似的功能, 因为关于舆情的系统使用到了ES, 一开始心想ES本身就有支持的API实现起来不难, 但我这里的需求还不太一样…

Altera的JTAG电路下载模块为何上下拉电阻,不可不知的秘密

一、FPGA背景信息 当前的FPGA市场上有国际和国产两大体系&#xff0c;国际排名&#xff0c;一直很稳定&#xff0c;国际上前三名Xilinx、Altera、Lattice&#xff0c;国内FPG厂商也在填补空白&#xff0c;低端、中低端市场上发力&#xff0c;替代潮流已在兴起&#xff0c;目前…

【驱动篇】龙芯LS2K0300之单总线驱动

实验过程 实验目的&#xff1a; 在龙芯开发板上面使用单总线驱动DS18B20温度传感器 ① 根据原理图连接DS18B20模块 ② 将i2c0引脚的功能复用为GPIO ③ 注册字符设备&#xff0c;按照DS18B20的读写时序编写读写驱动接口 ④ 编写测试用例解析传感器的数值 原理图 将板子上…

马尔可夫聚类算法

马尔可夫聚类算法&#xff08;Markov Clustering Algorithm&#xff0c;MCL&#xff09;是一种用于图聚类的算法&#xff0c;广泛应用于生物信息学、社交网络分析、推荐系统等领域。 其核心思想是模拟随机游走过程&#xff0c;通过迭代地扩散和收缩图上的概率分布来识别图中的…

章十九、JavaVUE —— 框架、指令、声明周期、Vue-cli、组件路由、Element

目录 一、 框架 ● vue.js 框架 ● 特点 ● Vue 安装 二、 第一个vue程序 ● 创建项目 ​编辑 ● 导入 vue.js ● 创建vue对象&#xff0c;设置属性&#xff0c;使用模版渲染到页面 介绍 — Vue.js (vuejs.org) 三、 vue指令 ● v-text ● v-html ● v-…

LeetCode 671.二叉树第二小的结点

这个题我们可以用数组辅助完成&#xff0c;然后进行排序后&#xff0c;再用再进行取值&#xff0c;这是我的代码块: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/void Preorde…

uniapp scroll-view 虚拟滚动【适合每条数据高度一致】

基本原理 有一万条数据&#xff0c;我们按10条一页来进行分组&#xff0c;会有1000页页面滚动到第10页的位置的时候&#xff0c;10页之后和10页之前是不用被显示的&#xff0c;可以直接隐藏掉如果是数据删除&#xff0c;页面会不流畅&#xff0c;会卡顿一下&#xff0c;且滚动位…

vue-cli搭建

一、vue-cli是什么&#xff1f; vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;…

QT事件处理系统之二:窗口部件的事件拦截,以及事件的传递顺序

1、案例说明 在父窗口中为selfLineEdit窗口安装事件过滤器,这样我们可以在父窗口中首先拦截来自于selfLineEdit本身产生的事件,并且决定该事件最终是否继续传递到selfLineEdit窗口本身。 2、关键代码 selfLineEdit.cpp #include "selfLineEdit.h" #include &l…

ECM和MEMS技术在心肺声学监测中的应用

心肺疾病是全球范围内导致死亡的主要原因。因此&#xff0c;对这些疾病迹象的准确和快速评估对于为患者提供适当的医疗保健至关重要。心血管疾病最重要的迹象之一是心脏周期的异常。大多数呼吸系统疾病则表现为呼吸周期的异常。有多种方法可以监测心脏和肺部的周期。听诊是监测…