查找和排序

目录

一、查找

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.rhkb.cn/news/357936.html

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

相关文章

C++回溯算法(2)

棋盘问题 #include<bits/stdc.h> using namespace std; void func(int,int); bool tf(int,int); void c(); int n,k; char a[110][110]; int cnt20; int main() {cin>>n>>k;for(int i0;i<n;i){for(int j0;j<n;j){cin>>a[i][j];}}func(0,0);cout…

北京BJ90升级新款迈巴赫大连屏四座头等舱行政四座马鞍

北京BJ90升级奔驰迈巴赫头等舱行政四座大联屏的内饰效果会非常出色&#xff0c;将为车辆带来更豪华、高端的内饰氛围。以下是升级后可能的效果&#xff1a; • 科技感提升&#xff1a;奔驰的中控系统一直以来都以其先进的科技和用户友好的界面而闻名。升级后&#xff0c;北京B…

EndNote 21 for Mac v21.3 文献管理软件安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行安装EndNote212、升级 三、运行1、打开软件&#xff0c;测试 安装完成&#xff01;&#xff01;&#xff01;四、注意事项 效果 一、下载软件 下载软件 链接&#xff1a;http://www.macfxb.cn 二、开始安装 1、双击…

深信服科技:2023网络钓鱼趋势分析报告

随着互联网的快速发展和广泛应用&#xff0c;网络钓鱼活动带来的安全隐患愈演愈烈。因应威胁发展&#xff0c;我 们编撰了此份分析报告&#xff0c;旨在全面了解其发展态势&#xff0c;并提醒相关部门、企业和公众加强防范。 在本报告中&#xff0c;我们将详细梳理网络钓鱼的近…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

USB - USB在消费领域的应用

Switching in USB Consumer Applications 通用串行总线&#xff08;USB&#xff09;已成为满足终端设备之间日益增长的快速数据传输需求的主流接口--例如&#xff0c;在个人电脑和便携式设备&#xff08;如手机、数码相机和个人媒体播放器&#xff09;之间下载和上传数据。 The…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-37微调

37微调 import os import torch import torchvision from torch import nn import liliPytorch as lp import matplotlib.pyplot as plt from d2l import torch as d2l# 获取数据集 d2l.DATA_HUB[hotdog] (d2l.DATA_URL hotdog.zip,fba480ffa8aa7e0febbb511d181409f899b9baa5…

已解决javax.management.BadStringOperationException异常的正确解决方法,亲测有效!!!

已解决javax.management.BadStringOperationException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 分析错误日志 检查字符串值合法性 确认字符串格式 优化代码逻辑 增加…

pcl::PointXYZRGBA造成点云无法显示

如果pcd文件没有rgba信息&#xff0c;使用pcl::PointXYZRGBA类型打开会提示以下信息&#xff1a; Failed to find match for field rgba另外&#xff0c;显示出来的点云是黑色&#xff0c;如果使用默认背景色为黑色&#xff0c;就无法显示点云了。 如果设置其它背景色&#xf…

多分类情绪识别模型训练及基于ChatGLM4-9B的评论机器人拓展

你的下一个微博罗伯特何必是罗伯特 这是一篇我在使用开源数据集(Twitter Emotion Dataset (kaggle.com))进行情绪识别的分类模型训练及将模型文件介入对话模型进行应用的过程记录。当通过训练得到了可以输入新样本预测的模型文件后&#xff0c;想到了或许可以使用模型文件对新样…

LLM漫谈(七)| 使用PyTorch从零构建LLM

LLM是最流行AI聊天机器人的核心基础&#xff0c;比如ChatGPT、Gemini、MetaAI、Mistral AI等。在每一个LLM&#xff0c;有个核心架构&#xff1a;Transformer。我们将首先根据著名的论文“Attention is all you need”-https://arxiv.org/abs/1706.03762 来构建Transformer架构…

三国之家网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;公告管理&#xff0c;三国视频管理&#xff0c;基础数据管理&#xff0c;三国图文管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#…

Inception_V2_V3

Inception_V2_V3 CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的…

Flume基础教程

Apache Flume教程 资料来源&#xff1a;Apache Flume - Introduction (tutorialspoint.com) Flume是一个标准的、简单的、健壮的、灵活的、可扩展的工具&#xff0c;用于将从各种数据生产者(web服务器)中所产生的数据抽取到Hadoop中。在本教程中&#xff0c;我们将使用简单的…

NeRF从入门到放弃4: NeuRAD-针对自动驾驶场景的优化

NeuRAD: Neural Rendering for Autonomous Driving 非常值得学习的一篇文章&#xff0c;几乎把自动驾驶场景下所有的优化都加上了&#xff0c;并且也开源了。 和Unisim做了对比&#xff0c;指出Unisim使用lidar指导采样的问题是lidar的垂直FOV有限&#xff0c;高处的东西打不…

Python18 数据结构与数据类型转换

1.python中的数据结构 在Python中&#xff0c;数据结构是用来存储、组织和管理数据的方式&#xff0c;以便有效地执行各种数据操作。Python提供了几种内置的数据结构&#xff0c;每种都有其特定的用途和操作方法。以下是Python中一些主要的数据结构&#xff1a; 1.列表&#…

Mac数据如何恢复?3 款最佳 Mac 恢复软件

如果您认为 Mac 上已删除的文件永远丢失了&#xff0c;那您就大错特错了&#xff01;实际上&#xff0c;即使您清空了 Mac 上的垃圾箱&#xff0c;也有许多解决方案可以帮助您恢复已删除的文件。最好的解决方案之一是 Mac 恢复删除软件。最好的Mac 恢复删除应用程序可以轻松准确…

【STM32c8t6】AHT20温湿度采集

【STM32c8t6】AHT20温湿度采集 一、探究目的二、探究原理2.1 I2C2.1. 硬件I2C2.1. 软件I2C 2.2 AHT20数据手册 三、实验过程3.1 CubeMX配置3.2 实物接线图3.3 完整代码3.4 效果展示 四、探究总结 一、探究目的 学习I2C总线通信协议&#xff0c;使用STM32F103完成基于I2C协议的A…

国产AI算力训练大模型技术实践

ChatGPT引领AI大模型热潮&#xff0c;国内外模型如雨后春笋&#xff0c;掀起新一轮科技浪潮。然而&#xff0c;国内大模型研发推广亦面临不小挑战。面对机遇与挑战&#xff0c;我们需保持清醒&#xff0c;持续推进技术创新与应用落地。 为应对挑战&#xff0c;我们需从战略高度…

android关于源码编译简单的apk处理

文章目录 简述文件的添加 简述 创建AOSP源码可编译一个简单apk的过程&#xff0c;代码子目录结构图如下所示 文件的添加 1.com.custom.test目录下创建TestActivity.java文件 用于简单的界面显示类 package com.custom.test;import android.app.Activity; import android.o…