Unit1_3:分治算法之排序问题

文章目录

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

一、归并排序

归并排序子操作的思路和Unit1_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)

决策树模型

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(1)(1.12) LeddarTech LeddarVu8

文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 LeddarTech LeddarVu8 是一款长距离&#xff08;185m&#xff09;激光雷达&#xff0c;可在 16 度至 99 度视场范围内提供 8 个单独的距离&#xff0c;具体取决于所使用的型号。ArduPilot 始终使用所提供的 8 个距离中最…

C++编程案例讲解-基于结构体的控制台通讯录管理系统

基于结构体的控制台通讯录管理系统 通讯录是一个可以记录亲人、好友信息的工具&#xff0c;系统中需要实现的功能如下&#xff1a; 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人…

APP开发:用途与未来前景|软件定制开发|网站小程序建设

APP开发&#xff1a;用途与未来前景|软件定制开发|网站小程序建设 APP开发已成为现代科技趋势的一部分&#xff0c;无论是日常生活还是商业领域&#xff0c;都有它的身影。通过开发APP&#xff0c;我们可以将想法、功能和内容转化为直观、易用的移动设备应用程序&#xff0c;满…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

如何防范AI诈骗

如何防范AI诈骗 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1f604; ✨座右铭&#…

AMEYA360荣获“国际潜力之星分销商”奖!

由全球电子技术领域知名媒体集团ASPENCORE主办的“全球电子元器件分销商卓越表现奖"颁奖典礼于2023年11月3日晚在深圳大中华喜来登酒店圆满结束! 全球电子元器件分销商卓越表现奖创办于2001 年&#xff0c;迄今已成功举办20年&#xff0c;此奖项旨在表彰支持电子产业发展的…

Linux下yum源配置实战

一、Linux下软件包的管理 1、软件安装方式 ① RPM包管理&#xff08;需要单独解决依赖问题&#xff09; ② YUM包管理&#xff08;需要有网络及YUM仓库的支持&#xff0c;会自动从互联网下载软件&#xff0c;自动解决依赖&#xff09; ③ 源码安装&#xff08;安装过程比较…

【已解决】设置SSH主机:VS Code-正在本地下载 VS Code 服务器

问题描述 很简单&#xff0c;就是我电脑强制重启之后用vscode再去连服务器&#xff0c;发现连不上了 解决办法 如上图&#xff0c;点击重试按钮&#xff0c;下面的这些东西就可以复制粘贴了 ctrf查找commit&#xff0c;这个时候就能找到一串d037ac076cee195194f93ce6fe2bdfe296…

Qt的事件

2023年11月5日&#xff0c;周日上午 还没写完&#xff0c;不定期更新 目录 事件处理函数的字体特点Qt事件处理的工作原理一些常用的事件处理函数Qt中的事件类型QEvent类的type成员函数可以用来判断事件的类型事件的类型有哪些&#xff1f;有多少种事件类 事件处理函数的字体特…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录&#xff0c;包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

vue2.0 打包,nginx部署

1、修改这里为空 否则报错&#xff1a;vue is undefined 2、修改为hash&#xff0c;重点&#xff1a;打包dist文件运行&#xff0c;必须这样 3、安装ngnix&#xff0c;重点&#xff1a;使用node的包&#xff1a;httpserve&#xff0c;失败 4、重点&#xff1a;配置代理转发 前端…

Python中最常用的10个内置函数!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python作为一种多用途编程语言&#xff0c;拥有丰富的内置函数库&#xff0c;这些函数可以极大地提高开发效率。本文将介绍Python中最常用的10个内置函数&#xff0c;它们的功能各有不同&#xff0c;但在实际编程…

Python 海龟绘图基础教学教案(一)

Python 海龟绘图——第 1 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 考察 turtle 基本命令&#xff0c;绘制直线&#xff0c;使用 forward&#xff0c;可缩写为 fd。 答案&#xff1a; import turtle as t t.fd(100) # 或者使用 t.forward(100) t.done() Python 海…

linux+python3.6.8+uwsgi+postgresql+django部署web服务器

linuxpython3.6.8uwsgipostgresqldjango部署web服务器 1.查看系统信息2.配置postgresql数据库2-1.安装postgresql数据库2-2.设置密码2-3.修改postgresql数据库配置文件 3.Python虚拟环境激活虚拟环境 4.Django4-1.Python 安装Django4-2.创建Django项目4-3.配置Django 5.uwsgi5-…

管道的介绍

管道 它是一个连接读写进程的文件&#xff0c;用户进程间数据交互和进程同步造作。管道是单向的&#xff0c;发送进程视管道为输出文件&#xff0c;将大量数据以字节流的形式送入管道&#xff1b;接收进程视管道为输入文件&#xff0c;接收管道的数据。 管道优缺点 1、管道…

Educational Codeforces Round 157 (Rated for Div. 2) D. XOR Construction (思维题)

题目 给定长为n-1(n<2e5)的整数序列a&#xff0c;第i个数a[i](0<a[i]<2n) 构造一个长为n的整数序列b&#xff0c;满足&#xff1a; 1. 0到n-1在b数组中每个数恰好出现一次 2. 对于&#xff0c; 题目保证一定有解&#xff0c;有多组时可以输出任意一组 思路来源 …

如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?

「十项全能」的 ChatGPT &#xff0c;用起来感受如何&#xff1f; 之前&#xff0c;作为 ChatGPT Plus 用户&#xff0c;如果你集齐下面这五个模式&#xff0c;就会成为别人羡慕的对象。 但现在&#xff0c;人们更加期盼的&#xff0c;是下面这个提示的出现&#xff1a; 这个提…

前端框架Vue学习 ——(三)Vue生命周期

生命周期&#xff1a;指一个对象从创建到销毁的整个过程。 生命周期的八个阶段&#xff1a;每触发一个生命周期事件&#xff0c;会自动执行一个生命周期方法&#xff08;钩子&#xff09; mounted&#xff1a;挂载完成&#xff0c;Vue 初始化成功&#xff0c;HTML 页面渲染成功…

基础课23——设计客服机器人

根据调查数据显示&#xff0c;使用纯机器人完全替代客服的情况并不常见&#xff0c;人机结合模式的使用更为普遍。在这两种模式中&#xff0c;不满意用户的占比都非常低&#xff0c;不到1%。然而&#xff0c;在满意用户方面&#xff0c;人机结合模式的用户满意度明显高于其他模…

20.6 OpenSSL 套接字分发RSA公钥

通过上一节的学习读者应该能够更好的理解RSA加密算法在套接字传输中的使用技巧&#xff0c;但上述代码其实并不算完美的&#xff0c;因为我们的公钥和私钥都必须存储在本地文本中且公钥与私钥是固定的无法做到更好的保护效果&#xff0c;而一旦公钥与私钥泄密则整个传输流程都将…