数据结构学习笔记(Ⅷ):排序

news2024/11/15 19:52:02

目录

1 排序基础

1.1 排序的基本概念

2 排序算法

2.1 插入排序

1.思想

2.实现

3.效率分析

4.优化

2.2 希尔排序

1.定义

2.实现

3.效率分析

3 交换排序

3.1 冒泡排序

1.定义

2.实现

3.效率分析

3.2 快速排序

1.算法思想

2.实现

3.效率分析

4 选择排序

4.1 简单选择排序

1.定义

2.实现

3.效率分析

4.2 堆排序

1.根堆

2.根堆建立

3.堆排序

4.效率分析

4.3 堆排序插入删除

1.插入

2.删除

5 其他排序算法

5.1 归并排序

1.原理

2.实现

3.效率分析

5.2 基数排序

1.定义

2.效率分析

3.适用领域

6 外部排序

6.1 外部排序

1.内外存数据交换

2.外部排序

3.时间分析

4.算法优化

6.2 败者树

1.算法思想

2.实现

6.3 置换-选择排序

6.4 最佳归并树


1 排序基础

1.1 排序的基本概念

排序:按关键字有序地排列表中的元素

评价指标:时间与空间复杂度、算法稳定性

分类:内部排序(数据在内存中)、外部排序

2 排序算法

2.1 插入排序

1.思想

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

2.实现

void Insertsort(int a[],int n)
{
	int i,j = 0;
	for (i = 0; i < n; i++)      // 遍历整个数组
	{
		if (a[i] < a[i - 1])     // 若当前元素小于其前驱,进入下一层循环
		{
			int temp = a[i];     // 因当前元素应位于其前驱之前,先存放在临时变量中 
			for (j = i - 1; j >= 0 && a[j] > temp; --j)    // 遍历该元素前驱之前的元素
			{
				a[j + 1] = a[j];   // 前驱依次后移
			}
			a[j+1] = temp;   // 将该元素放在比他大的前驱前
		}
	}
}

3.效率分析

空间复杂度O(1)

时间复杂度:O(n) ~ O(n^2)

平均时间复杂度:O(n^2)

稳定性:稳定

4.优化

2.2 希尔排序

1.定义

希尔排序︰先将待排序表分割成若干子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。 

2.实现

3.效率分析

空间复杂度:O(1)

最坏时间复杂度:O(n^2)

 稳定性:不稳定

仅适用于顺序表

3 交换排序

3.1 冒泡排序

1.定义

从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。

2.实现

3.效率分析

空间复杂度:O(1)

时间复杂度:最好O(n),最坏O(n^2),平均O(n^2)

稳定性:稳定

适用于链表排序

3.2 快速排序

1.算法思想

在待排序表L[1..n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1..k-1]和LIk+1..n],使得L1...k-1]中的所有元素小于pivot,Llk+1..n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。

2.实现

3.效率分析

稳定性:不稳定

适用于链表排序

4 选择排序

4.1 简单选择排序

1.定义

每一趟在待排序元素中选取关键字最小的元素加入有序子序列


2.实现

3.效率分析

空间复杂度:O(1)

时间复杂度:O(n^210)

稳定性:不稳定

适用于链表

4.2 堆排序

1.根堆

若n个关键字序列L[ 1...n]满足下面某一条性质,则称为堆(Heap) :

若满足:L(i)≥L(2i)且L(i)≥L(2i+1) (1 ≤i sn/2) —―大根堆(大顶堆)

若满足:L(i)≤L(2i)且L(i)≤L(2i+1) (1 s i ≤n/2 ) —―小根堆(小顶堆)

将大(小)根堆看作顺序存储的完全二叉树,即根结点大(小)于左/右子树结点。

2.根堆建立

检查所有非终端结点(i <= [n/2])是否满足要求,若不满足将当前结点与更大的子树结点互换。

3.堆排序

每一轮都将堆顶元素加入有序子序列(与待排序中的最后一个元素交换),并将待排序元素序列再次调整为根堆。

基于大根堆得到递增序列

4.效率分析

若树高为h,某结点在第i层,则将这个结点向下调整最多只需要“下坠”h-i层,关键字对比次数不超过2(h-i)

时间复杂度:建堆O(n) + 堆排序O(n1og_2n) = O(n1og_2n)

空间复杂度:O(n)

稳定性:不稳定

4.3 堆排序插入删除

1.插入

以小根堆为例,新元素放入表尾,与父节点对比,若新元素较小就交换,持续上升。

2.删除

用堆底元素代替被删除的元素,并将该元素进行下坠交换。

5 其他排序算法

5.1 归并排序

将两个或多个有序序列合并

1.原理

2.实现

将一个序列拆分成两个序列进行多轮归并排序

3.效率分析

时间复杂度:O(n*Log_2n)

空间复杂度:O(n)

5.2 基数排序

1.定义

第一轮以个位进行分配,将各元素链接后得到按个位递减排序的序列;次轮以十位进行分配,将各元素链接后得到按十位递减排序的序列;再次轮按百位进行分配,得到按百位递减排序的序列

2.效率分析

一轮分配O(n),一轮手机O(r),共d轮分配与收集

时间复杂度:O(d*(n + r))

空间复杂度:O(r) 

稳定性:稳定

3.适用领域

6 外部排序

6.1 外部排序

1.内外存数据交换

2.外部排序

因数据元素过多,外存数据无法全部读入内存进行排序,因此要进行基于归并排序的外部排序。

3.时间分析

外部排序时间开销=读写外存的时间+内部排序所需时间+内部归并所需时间

4.算法优化

可以使用多路归并,减少读写外存的时间。但内存开销与归并所需时间会增加

6.2 败者树

多路归并数增加,导致内部归并所需时间增加。

1.算法思想

可视为—棵完全二叉树(多了一个头头)。k个叶结点分别是当前参加比较的元素,非叶子结点用来记忆左右子树中的“失败者”,而让胜者往上继续进行比较,一直到根结点。

2.实现

6.3 置换-选择排序

6.4 最佳归并树

要使磁盘I/O次数最少,就要让归并树的带权路径长度最小,构造K叉哈夫曼树。  

 

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

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

相关文章

第4章 SpringBoot与Web应用

文章目录第4章 SpringBoot与Web应用4.1 配置Tomcat运行4.2 https安全访问4.3 数据验证4.4 配置错误页4.5 全局异常处理4.6 文件上传4.6.1 基础上传4.6.2 上传文件限制4.6.3 上传多个文件4.7 拦截器4.8 AOP拦截器4.9 本章小结4.9 本章小结第4章 SpringBoot与Web应…

[附源码]计算机毕业设计病人跟踪治疗信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux系统移植二:生成fsbl引导文件并制作BOOT.bin

前情提要 对于ZYNQ而言&#xff0c;在引导过程中&#xff0c;先运行FSBL来设置PS&#xff0c;然后运行U-Boot用于加载Linux内核映像并引导Linux Linux系统移植一&#xff1a;移植U-BOOT 添加自己的板子并编译&#xff08;非petalinux版&#xff09; 一文中已成功生成了u-boot…

基于MPPT的PV光伏发电simulink建模和仿真

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 MPPT控制器的全称是“最大功率点跟踪”&#xff08;Maximum Power Point Tracking&#xff09;太阳能控制器&#xff0c;是传统太阳能充放电控制器的升级换代产品。MPPT控制器能够实时侦测…

ManiSkill 2022机器学习顶会ICLR上的世界顶尖机械臂大赛赛题解读,演示轨迹转换,点云查看

1.赛事相关信息 点击查看 2.赛题分析 软体对GPU要求较高&#xff0c;环境配置复杂&#xff0c;选择刚体环境先以模仿学习/强化学习的刚体环境为基础&#xff0c;后期再考虑无限制刚体环境部分任务&#xff08;如将物块移动到指定位置&#xff09;&#xff0c;存在相机之外的…

Day818.电商系统的分布式事务调优 -Java 性能调优实战

电商系统的分布式事务调优 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于电商系统的分布式事务调优。 一个线上事故&#xff0c;在一次 DBA 完成单台数据库线上补丁后&#xff0c;系统偶尔会出现异常报警&#xff0c;开发工程师很快就定位到了数据库异常问题。 具…

SQL通用语法与DDL操作

学习笔记 sql通用语法 1 sql语句可以单行或多行书写&#xff0c;以分号结尾&#xff1b; 2 sql语句可以使用空格/缩进来增强语句的可读性&#xff1b; 3 mysql数据库的sql语句不区分大小写 4 单行注释&#xff1a;-- 内容 或 # 内容 多行注释&#xff1a; /* 内容 */ sql语句…

【地图之vue-baidu-map】点击获取坐标(点Marker)、坐标集(多边形polygon)

点击获取坐标&#xff08;点Marker&#xff09; 官网链接&#xff1a;Vue Baidu Map 需求 1.点击某点设置该点为中心点 2.获取点的经纬度 3.确定选取成功&#xff0c;取消就不赋值。 实现步骤 第一步&#xff1a;设置打开弹窗的地方 <el-button click"clickAdd…

c# .net 树莓派/香橙派用到物联网包Iot.Device.bindings 支持设备说明文档

c# .net 树莓派&#xff08;进口&#xff0c;贵&#xff09;/香橙派&#xff08;国产&#xff0c;功能相同&#xff0c;性价比高&#xff09;用到物联网包Iot.Device.bindings 支持设备说明文档 我们c# .net 开发树莓派/香橙派都需要用到Iot.Device.bindings和System.Device.G…

阿里巴巴 Github 星标 57.9KJava 面试突击汇总(全彩版)首次公开

现在互联网大环境不好&#xff0c;互联网公司纷纷裁员并缩减 HC&#xff0c;更多程序员去竞争更少的就业岗位&#xff0c;整的 IT 行业越来越卷。身为 Java 程序员的我们就更不用说了&#xff0c;上班 8 小时需要做好本职工作&#xff0c;下班后还要不断提升技能、技术栈&#…

命令注入漏洞解析

漏洞简介 Atlassian Bitbucket Server 和 Data Center 是 Atlassian 推出的一款现代化代码协作平台&#xff0c;支持代码审查、分支权限管理、CICD 等功能。 受影响的Bitbucket Server 和 Data Center版本存在使用环境变量的命令注入漏洞&#xff0c;具有控制其用户名权限的攻…

代码随想录刷题记录day34 动态规划理论基础+斐波那契数+爬楼梯+使用最小花费爬楼梯

代码随想录刷题记录day34 动态规划理论基础斐波那契数爬楼梯使用最小花费爬楼梯 动态规划理论基础 解决的问题 由前一个状态决定了后一个的状态&#xff0c;可以用动态规划来解决。贪心是没有状态推导的。 解题步骤 确定dp数组&#xff08;dp table&#xff09;以及下标的…

一键集成 SQL 审核到你的 GitLab 和 GitHub CI/CD

本文以 GitLab 为例&#xff0c;GitHub 方式类似。 操作步骤 事先准备 开启 Bytebase 团队版&#xff08;从 v1.8.0 开始&#xff0c;你可以直接开启 14 天的团队版免费试用&#xff09;。 为你的 Bytebase workspace 和项目开启 VCS 工作流&#xff1a;https://www.bytebas…

基于钉钉通讯录,同步构建本地LDAP服务

上一篇《利用飞书通讯录同步搭建本地LDAP》方案发出后&#xff0c;引起不少企业 IT 人员共鸣。本次&#xff0c;宁盾针对使用了钉钉社交应用的企业推出基于钉钉通讯录&#xff08;组织架构和用户信息&#xff09;同步搭建本地 LDAP的方案。 钉钉已经成为很多企业日常处理工作的…

基于FPGA的智能小车系统

目 录 前 言 1 第1章 系统总体方案设计 4 1.1 系统任务描述 4 1.2 控制系统要求 4 1.3 方案设计与论证 4 1.3.1 小车载体选择 4 1.3.2 主控制器选择 5 1.3.3 传感器选择 5 1.3.4 电机驱动选择 6 1.3.5 稳压电源选择 7 1.3.6 智能小车系统最终方案 7 1.4 系统总体设计 8 1.4.…

【Java开发】 Spring 07 :Spring AOP 实践详解(通过 AOP 打印数据访问层)

AOP 指是面向切面编程&#xff08;通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术&#xff09;&#xff0c;利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提…

SpringBoot 3.0 新特性,内置声明式 HTTP 客户端

http interface 从 Spring 6 和 Spring Boot 3 开始&#xff0c;Spring 框架支持将远程 HTTP 服务代理成带有特定注解的 Java http interface。类似的库&#xff0c;如 OpenFeign 和 Retrofit 仍然可以使用&#xff0c;但 http interface 为 Spring 框架添加内置支持。 什么是…

RabbitMQ之集群方案原理

对于无状态应用&#xff08;如普通的微服务&#xff09;很容易实现负载均衡、高可用集群。而对于有状态的系统&#xff08;如数据库等&#xff09;就比较复杂。 1、业界实践 主备模式&#xff1a;单活&#xff0c;容量对等&#xff0c;可以实现故障转移。使用独立存储时需要借…

【Matplotlib绘制图像大全】(二十五):Matplotlib使用figure()添加画布

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

2022re:Invent:亚马逊云科技拥有超过15年的数据创新经验

在探索适合企业的数据战略的道路上&#xff0c;企业并不孤单。亚马逊云科技有着超过15年的数据领域创新经验。并一直在尝试通过创新的方法去改进数据存储和分析的过程&#xff1a;亚马逊云科技在云中提供了第一个可扩展存储服务S3、发布了云上第一个专门构建的数据库DynamoDB和…