Unit1_3:分治算法之排序问题

news2024/12/27 15:54:05

文章目录

  • 一、归并排序
  • 二、快速排序
    • 思路
    • 伪代码
    • 流程图
    • 时间复杂度
    • 改进
  • 三、堆排序
    • 结构
    • 插入
    • 提取最小值
    • 排序
    • 抽象
  • 四、比较排序总结
    • 决策树模型

一、归并排序

归并排序子操作的思路和Unit_2逆序计算一样
下面写一下伪代码

if left < right then
	center←L(left + right)/2];
	Mergesort(A, left, center);
	Mergesort(A, center+1, right);
	“Merge” the two sorted arrays;(逆序中的排序思路)
end
else 
	return A[left]

时间复杂度:

T ( n ) = { 2 T ( n 2 ) + n i f   n > 1 1 i f   n = 1 T(n)=\left\{ \begin{array}{ll} 2T(\frac{n}{2})+n & if \space n>1 \\ 1 & if \space n=1 \nonumber \end{array} \right. T(n)={2T(2n)+n1if n>1if n=1
在第一节时提及三种计算方式,最后得出复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

二、快速排序

c语言中的qsort。

思路

每次分成两份,使得 A [ u ] < A [ q ] < A [ v ] A[u]< A[q] < A[v] A[u]<A[q]<A[v]    f o r for for    a n y any any     p ≤ u ≤ q − 1 p≤u≤q- 1 puq1    a n d and and     q + 1 + ≤ v ≤ r q+1+≤v≤r q+1+vr
在这里插入图片描述
x称为主元。
下面看思路图:
起始位置, i = − 1 , j = 0 , p = 0 i=-1,j=0,p=0 i=1,j=0,p=0
在这里插入图片描述
A [ j ] < A [ r ] A[j]<A[r] A[j]<A[r]时, i i i++, A [ i ] = A [ j ] A[i]=A[j] A[i]=A[j], j j j++
在这里插入图片描述
下一个 A [ j ] > A [ r ] A[j]>A[r] A[j]>A[r], j j j++,下一个亦如此
在这里插入图片描述
走到 A [ j ] = 1 A[j]=1 A[j]=1,即 A [ j ] < A [ r ] A[j]<A[r] A[j]<A[r],应 i i i++, A [ i ] = A [ j ] A[i]=A[j] A[i]=A[j], j j j++
在这里插入图片描述
最终j=r时停止

在这里插入图片描述
A [ i + 1 ] A[i+1] A[i+1] A [ r ] A[r] A[r]调换
在这里插入图片描述

伪代码

Partition(A,p,r)
x ← A[r];  //A[r] is the pivot element
i ← p-1;
for j←p to r-1 do
	if A[j]≤x then
		i ← i+1;
		exchange A[i] and A[j];
	end
end
exchangeA[i+1] and A[r];//Put pivot in position
return i+1;      //q ← i+1

这个子操作的时间复杂度为 O ( r − p ) O(r-p) O(rp)
整个快速排序

Quicksort(A,p,r)
if p<r then
	q ← Partition(A,p, r);
	Quicksort(A,P,q-1);
	Quicksort(A,q+1,r);
end
return A;

流程图

在这里插入图片描述

时间复杂度

若总是能将数组分成两半:

T ( n ) = { 2 T ( n 2 ) + n i f   n > 1 1 i f   n = 1 T(n)=\left\{ \begin{array}{ll} 2T(\frac{n}{2})+n & if \space n>1 \\ 1 & if \space n=1 \nonumber \end{array} \right. T(n)={2T(2n)+n1if n>1if n=1

T ( n ) = O ( n l o g n ) T(n)=O(nlogn) T(n)=O(nlogn)

若最坏情况碰到不平衡分区:

T ( n ) = { T ( n − 1 ) + n i f   n > 1 1 i f   n = 1 T(n)=\left\{ \begin{array}{ll} T(n-1)+n & if \space n>1 \\ 1 & if \space n=1 \nonumber \end{array} \right. T(n)={T(n1)+n1if n>1if n=1

T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)

改进

为了增加算法稳定性,主元采取随机选取的策略:
r a n d o m ( p , r ) random(p, r) random(p,r)是一个伪随机数生成器,它返回 p p p r r r之间的随机数。
改进算法的时间复杂度计算不难,这里不多赘述,这里用到指标变量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、堆排序

结构

堆本质上就是完全二叉树。除了最低层,所有层都满了。如果最低层未满,则必须将节点打包到左侧。
大顶堆满足父节点值比子节点大,小顶堆满足父节点值比子节点小。
在这里插入图片描述
若有 n n n个元素,则树的高度 h = l o g 2 n h=log_2n h=log2n,每次操作一层,则操作的时间复杂度为 O ( l o g n ) O(logn) O(logn)
这种结构可以用数组表示(因为节点都是填满的):
    根节点位于数组位置1
    对于数组位置i中的任何元素
        左子结点位于 2 i 2i 2i位置。
        右子结点位于 2 i + 1 2i+1 2i+1位置。
        父节点位于位置 i 2 \frac{i}{2} 2i
在这里插入图片描述

插入

将新元素添加到最低级别的下一个可用位置,如果违反则恢复最小堆属性
一般策略是向上渗透(或向上冒泡):如果元素的父元素大于元素,则将父元素与子元素交换。
在这里插入图片描述
插入的时间复杂度:最坏情况下就是树的高度,因此 T ( n ) = O ( l o g n ) T(n)=O(logn) T(n)=O(logn)

提取最小值

将根节点值拿走后,将最后一个元素复制到根(即覆盖存储在那里的最小元素)
在这里插入图片描述
通过向下渗透(或向下冒泡)恢复min-heap属性:如果元素比它的任何一个子元素都大,那么将它与它的子元素中较小的元素交换
在这里插入图片描述

排序

最小元素位于堆的顶部,每次都提取根节点的最小值,然后按上述步骤恢复小顶堆的性质,重复此操作,因为有 n n n个元素,因此时间复杂度 T ( n ) = n O ( l o g n ) = O ( n l o g n ) T(n)=nO(logn)=O(nlogn) T(n)=nO(logn)=O(nlogn)
但排序的前提是要现有一个小顶堆,因此从根节点开始根据小顶堆的性质进行替换
在这里插入图片描述

抽象

这和操纵系统的优先级队列一样.事实上确实可以考虑这一算法.优先级队列是一种抽象的数据结构,支持两种操作:插入和提取最小

四、比较排序总结

插入排序,归并排序,堆排序和快速排序都是基于元素比较完成.
事实上,基于元素比较的排序时间复杂度最快就是 O ( n l o g n ) O(nlogn) O(nlogn)

决策树模型

基于比较的排序本质上就是抽象成这一模型
在这里插入图片描述

每个叶子对应一个不同的输入顺序
为了使比较排序正确,每个排列必须作为一个叶子出现
决策树可以为任何基于比较的排序算法的执行建模,最坏情况下的运行时间=树的高度

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

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

相关文章

Linux CentOS配置阿里云yum源

一&#xff1a;先备份文件&#xff0c;在配置失败时可以恢复 cd /etc/yum.repos.d mkdir back mv *.repo back 二&#xff1a;下载阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.…

轻量封装WebGPU渲染系统示例<17>- 使用GPU Compute之元胞自动机(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifeTest.ts 系统特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据(内外部相关资源)和渲染机制分离。…

使用 Visio 绘制立方体

一、自带的立方体 点击&#xff0c;将其拖拽至空白画布中 点击立方体&#xff0c;可以拖拽立方体的边线改变形状&#xff0c;如下&#xff1a; 可以看到&#xff0c;立方体三个面的颜色是不同的&#xff0c;最上方的面颜色浅一些。 如果想要三个面的颜色相同&#xff0c;先点击…

项目文章 | 总石油烃-重金属污染与土壤微生态系统:细菌多样性、组装和生态功能研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组许科研服务的易基因。 2023年9月30日&#xff0c;中南大学张杜博士为第一作者、李骞教授为通讯作者在《Chemosphere》杂志上发表题为“Effects of single and combined contamination of total petroleum hydr…

收银系统费率哪家低

收银软件能帮助店铺管好货和账&#xff0c;受到不少店家的喜爱。 如果只是为了收钱&#xff0c;直接微信或者支付宝就好了&#xff0c;但是如果要管理商品、销售&#xff0c;那就需要上一个收银软件&#xff0c;谁做生意不是为了赚点钱&#xff0c;不能开源只能节流了。 上线收…

【Redis】Java连接redis进行数据访问及项目的实例应用场景

目录 一、连接 二、数据访问 1. 字符串(String) 2. 哈希(Hash) 3. 列表(List) 4. 集合(Set) 三、项目应用 1. 作用 2. 实例 一、连接 打开开发工具( IDEA ) &#xff0c;在需要连接Redis的项目中&#xff0c;找到 pom.xml 配置文件导入依赖 在pom.xml 配置文件中导入以…

MySQL表的增删改查(基础且保姆级的教程)

CRUD 1.注释:在SQL中可以使用"--空格 描述"来表示注释说明 2.CRUD即增加(Create), 查询(Retrieve), 更新(Update),删除(Delete)四个单词首字母的缩写 新增(Create) 简述(一般写法): insert into 表名 values(列,列...) ->给出列的数目和类型,都是要和表结构匹配…

vue3 组件篇 Icon

文章目录 组件介绍如何在项目中搭建iconfont字体图标库快速创建一套iconfont修改 或 新增iconfont 组件安装与使用组件代码参数说明关于dxui组件库 组件介绍 Icon&#xff08;图标&#xff09;组件是一种常见的用户界面元素&#xff0c;用于在网页、移动应用和桌面应用中显示图…

世微LED 大功率升压恒流驱动芯片 平板显示LED背光板灯串恒流控制器 AP9193

概述 AP9193 是一款高效率、高精度的升 压型大功率 LED 灯恒流驱动控制芯片。 AP9193 内置高精度误差放大器&#xff0c;固 定关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c; 特别适合大功率、多个高亮度 LED 灯的串 恒流驱动。 AP9193 采用固定关断时间的控制方 式…

【验证码系列】Google验证码从数据训练到机器自动识别算法构建

文章目录 1. 写在前面2. CSCI级设计决策2.1. Google验证码突防关联2.2. Google验证码突防行为设计决策 3. Google验证码突防体系结构设计3.1. Google验证码突防部件3.1.2. Google验证码突防组成 3.2. Google验证码突防软件3.2.1. Google验证码突防软件体系结构3.2.2. Google验证…

网页JS代码,加密与不加密的区别

网页中用JS实现的功能&#xff0c;不加密时&#xff0c;是对所有访问者透明的&#xff0c;任何人都可以直接查看、分析其中的功能逻辑。而经混淆加密后的JS&#xff0c;以密文形式存在&#xff0c;可防止它人窥探。 例1&#xff0c;某网站JS代码&#xff1a; 使用JShaman对图中…

Airpods - 放到洗衣机里洗,最后成功救回 Airpods Pro,功能恢复如初!

前几天加班回来很晚了&#xff0c;倒头就睡&#xff0c;耳机放在裤兜子里&#xff0c;因为第二天是周末&#xff0c;睡到自然醒&#xff0c;没想到打开洗衣机洗衣服也没想起来耳机还在兜里。&#xff08;此时想抽自己的大嘴巴子&#xff09;洗完衣服去晒衣服&#xff0c;发现耳…

自动识别图片文字表格:高效神器,告别繁琐手动操作

现代科技的快速发展为我们的生活带来了许多便利和效率提升。在数据处理和文档管理方面&#xff0c;自动化技术也日益成熟和普及。一项非常有用的技术是自动识别文字生成表格&#xff0c;它可以将大量的图片识别成文本并转换为表格形式&#xff0c;使得数据的整理和分析更加简便…

【CIO人物展】国家能源集团信息技术主管王爱军:中国企业数智化转型升级的内在驱动力...

王爱军 本文由国家能源集团信息技术主管王爱军投递并参与《2023中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业—锐捷网络 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着全球信息化和网络化的进程日益加速&#xff0c;数字化转型已经成为当下各大企业追求的核心…

浅析应急疏散照明设计在高层建筑中的应用

【摘要】作为工程设计人员&#xff0c;对高层建筑的应急照明设计应有足够的认识和重视&#xff0c;以保证在出现失火事件时&#xff0c;可以有效地引导建筑内的人员安全逃离、正确疏散&#xff0c;这是建筑设计的*大价值所在。在设计应急照明时&#xff0c;应根据当地的情况选择…

香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付

10月31日&#xff0c;香港金融科技周正式拉开帷幕。这项香港金融科技界地年度盛事今年已经踏入了第八届&#xff0c;本届活动吸引超过数百位金融科技专业人士、创业者和行业领袖现场参与&#xff0c;线上参与观众超过10万人次。 在金融科技周的圆桌会议上&#xff0c;VERTU首席…

使用群晖Docker搭建HomeAssistant并实现异地公网访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 使用群晖Docker搭建HomeAssistant并实现异地公网访问 文章目录 使用群晖Docker搭建HomeAssistant…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…

Kanna库

LuaHTTP是一个用于发送HTTP请求的Lua库&#xff0c;它提供了简单且易于使用的接口。您可以使用LuaHTTP库发送GET、POST、PUT、DELETE等类型的HTTP请求&#xff0c;并处理响应。 以下是LuaHTTP库的一个示例用法&#xff1a; local http require(“socket.http”) local respo…

wscat

wscat 是一个用于 WebSocket 通信测试的命令行工具 安装wscat flynnsinflynnsin:~$ sudo npm install -g wscat loadDep:ws → afterAdd ▄ ╢████████████████████████████████████░░░░░░░░░░░░░░░░░░░░░░░…