当前位置: 首页 > news >正文

数据结构:归并排序和堆排序

归并排序

归并排序(merge sort)是利用“归并”操作的一种排序方法。从有序表的讨论中得知,将两个有序表“归并”为一个有序表,无论是顺序表还是链表,归并操作都可以在线性时间复杂度内实现。归并排序的基本操作是将两个位置相邻的有序记录子序列R[i…m]R[m+1…n]归并为一个有序记录序列 R[i…n],如下图算法所示:

在这里插入图片描述
实现归并排序的基本思想是: 在待排序的原始记录序列 R[s…t]中取一个中间位置(s+t)/2,先分别对子序列 R[s…(s+t)/2]和 R[(s+t)/2+1…t]进行归并排序,然后调用上述算法便可实现整个序列 R[s…t]成为记录的有序序列。因此,归并排序的算法也可以是一个递归调用的算法,算法如下所示:

在这里插入图片描述

在这里插入图片描述
利用算法 3.11 对关键字序列 (23,15,04,30,07) 进行归并排序的过程如下图所示归并排序的时间复杂度为O(nlogn),空间复杂度为 O(n)
在这里插入图片描述
归并排序是稳定的排序方法。

堆排序

堆排序(heap sort)是对选择排序的一种改进方法。在此首先需引进“堆”的概念。
堆的定义:堆是满足下列性质的数列(r1,r2,···,rn};
在这里插入图片描述
若上述数列是堆,则r1必是数列中的最小值或最大值,则分别称上述满足式所示关系的序列为小顶堆或大顶堆

堆排序即是利用堆的特性对记录序列进行排序的一种排序方法。具体作法是:先按记录的关键字建一个“大顶堆”,因此选得一个关键字为最大的记录,然后与序列中最后一个记录交换,之后继续对序列中前 n-1 记录进行“筛选”,重新将它调整为一个“大顶堆”,再将堆顶记录和第 n-1 个记录交换。这样,有序性逐渐从右部向左扩大,如此反复直至排序结束。下图所示为堆排序的一个例子。
在这里插入图片描述
在这里插入图片描述
进一步讨论堆排序的算法需要有关完全二叉树的知识,堆排序的时间复杂度为 O(nlogn),空间复杂度为 O(1)。

http://www.lryc.cn/news/12060.html

相关文章:

  • 基于easyexcel的MySQL百万级别数据的excel导出功能
  • js-DOM02
  • 作为一名开发工程师,我对 ChatGPT 的一些看法
  • Flask中基于Token的身份认证
  • 波奇学数据结构:时间复杂度和空间复杂度
  • 移动OA办公系统为企业带来便捷办公
  • 什么是Type-c口?Type-c口有什么优势?
  • Go开发者常犯的错误,及使用技巧 (1)
  • Servlet 作业
  • Hive高阶函数:explode函数、Lateral View侧视图、聚合函数、增强聚合
  • 信息系统服务管理
  • Windows10 安装ElasticStack8.6.1
  • gRPC 非官方教程
  • 6.2【人工智能与深度学习】RNN、GRU、远程服务管理、注意力、Seq2 搜索引擎和内存网络
  • 软件工程复习
  • 将Nginx 核心知识点扒了个底朝天(二)
  • 【PowerQuery】PowerBI 的PowerQuery支持的数据集成
  • scipy spatial transform Rotation库的源代码
  • JAVA文件操作
  • 字符串匹配 - 模式预处理:BM 算法 (Boyer-Moore)
  • RV1126笔记三十:freetype显示矢量字体
  • polkit pkexec 本地提权漏洞修复方案
  • es-06聚合查询
  • 面试知识点准备与总结——(并发篇)
  • Django框架之模型视图-URLconf
  • 操作系统闲谈06——进程管理
  • DaVinci 偏好设置:用户 - UI 设置
  • Nacos超简单-管理配置文件
  • 基于微信小程序的中国各地美食推荐平台小程序
  • 如何优雅的导出函数