查找和排序

目录

一、查找

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…

第12天:前端集成与Django后端 - 用户认证与状态管理

第12天&#xff1a;前端集成与Django后端 - 用户认证与状态管理 目标 整合Django后端与Vue.js前端&#xff0c;实现用户认证和应用状态管理。 任务概览 设置Django后端用户认证。创建Vue.js前端应用。使用Vuex进行状态管理。实现前端与后端的用户认证流程。 详细步骤 1. …

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;这在在线零…

vue.js获取body高度

在mounted生命周期钩子中获取&#xff1a; export default {mounted() {this.bodyHeight document.body.offsetHeight;},data() {return {bodyHeight: 0};} }; export default {data() {return {bodyHeight: 0};},mounted() {this.bodyHeight window.innerHeight;} };expor…

如何高效地为pip换源:详细操作指南

在Python开发中&#xff0c;pip是我们不可或缺的包管理工具。然而&#xff0c;默认的官方源下载速度较慢&#xff0c;尤其是在国内使用时可能会遇到网络问题。为了提高下载速度&#xff0c;我们可以通过更换国内的镜像源来解决这一问题。本文将详细介绍如何高效地为pip换源&…

计网:网络应用层【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;通过该方 法…

python中不同维度的Tensor向量为何可以直接相加——广播机制

文章目录 广播机制示例解释广播机制如何工作代码示例输出解释广播机制的本质 在矩阵加法中&#xff0c;如果两个张量的形状不同&#xff0c;但其中一个张量的形状可以通过广播机制扩展到与另一个张量的形状相同&#xff0c;则可以进行加法操作。广播机制在深度学习框架&#xf…

VB实现加法计算

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

计算机组成原理-第6章计算机的运算方法

6.1无符号数和有符号数 6.1.1无符号数 没有符号&#xff0c;在寄存器中的每一位均可用来存放数值。 6.1.2有符号数 1&#xff0c;机器数与真值&#xff1a;0表示正&#xff0c;1表示负。 把符号数字化的数称为机器数&#xff0c;而把带或-符号的数称为真值。 2&#xff0…

Python爬虫从入门到精通,大概需要多长时间的投入呢

从Python爬虫入门到精通所需的投入时间因个体差异而异&#xff0c;因为每个人的学习速度、背景知识和学习动力都有所不同。然而&#xff0c;我可以提供一个大致的时间框架和建议&#xff0c;帮助你规划你的学习路径。 入门阶段 时间估计&#xff1a;1-3个月 基础知识&#x…

React@16.x(38)路由v5.x(3)其他组件

目录 1&#xff0c;Link2&#xff0c;NavLink3&#xff0c;Redirect 之前的文章中&#xff0c;已经介绍过了 BrowserRouter / HashRouter&#xff0c;Route&#xff0c;Switch&#xff0c;withRouter 这些组件。 再介绍3个常用的组件&#xff1a; 1&#xff0c;Link 官方文档…

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

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

面试突击指南:Java基础面试题1

1. Lambda表达式 Lambda表达式提供了一种简洁的方式来实现接口的单个抽象方法,通常用于替代匿名类。 示例: List<String> names = Arrays.asList("peterF", "anna", "mike", "xenia"); Collections.sort(names, (a, b) -&g…

java面向对象(4)

目录 1.多态 1.1如何构成多态 1.2多态的调用规则 1.3多态的向下转型 1.4 instanceof运算符 1.5多态的好处 2.final关键字 3.接口 3.1接口中可以定义哪些成员 3.2接口的使用 3.2接口的特性 1.多态 多态:同一种事物,在不同的时刻表现出不同的状态 1.1如何构成多态 …

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实现起来不难, 但我这里的需求还不太一样…