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

数据结构与算法--交换排序与归并排序

文章目录

    • 回顾
    • 提要
    • 冒泡排序
      • 冒泡排序的过程
      • 冒泡排序的实现
      • 冒泡排序算法评价
    • 快速排序
      • 快速排序的划分方法
      • 快速排序的过程
      • 快速排序的实现
      • 快速排序算法性能分析
      • 快速排序的改进
    • 归并排序
      • 二路归并排序
      • 合并两个有序表
      • 归并排序示例
      • 归并排序算法性能分析
    • 各种内排序方法的比较
    • 各种内排序算法的特点
    • 总结


回顾

  • 排序的基本概念,包括稳定排序与不稳定排序。
  • 直接插入排序和简单选择排序方法。
  • 通过待排序和排序后的关键字序列,判断使用的排序方法(例如冒泡排序)。

提要

  • 交换排序:冒泡排序、快速排序。
  • 归并排序:二路归并排序。
  • 各种内排序算法的讨论。

冒泡排序

  • 通过相邻记录的比较和交换,将无序区关键字最小的记录逐步交换到无序区的第一位,加入到有序区。
  • 如果一趟排序没有发生交换,则排序结束。
  • 在这里插入图片描述

冒泡排序的过程

  • 通过示例展示冒泡排序的初始状态和每一趟排序后的结果。
  • 在这里插入图片描述

冒泡排序的实现

void BubbleSort(ElemType L[], int n) {int i, j;bool exchange;ElemType tmp;for (i = 0; i < n - 1; i++) {exchange = false;for (j = n - 1; j > i; j--) {if (L[j] < L[j - 1]) {tmp = L[j];L[j] = L[j-1];L[j-1] = tmp;exchange = true;}}if (exchange == false) return;}
}

冒泡排序算法评价

  • 时间复杂度:O(n²)。
  • 空间复杂度:O(1)。
  • 是稳定的排序算法。
  • 在这里插入图片描述

快速排序

  • 通过选择枢轴元素,将序列分为两个子序列,递归地对子序列进行排序。
  • 在这里插入图片描述

快速排序的划分方法

  • 选择序列第一个元素作为枢轴,通过low和high指针移动,将序列分为两部分。
  • 每趟排序,使一个元素放入其最终位置,这个元素称为枢轴(pivot),通常选序列的第一个元素。
  • 枢轴把整个序列划分为两个子序列。利用递归,分别对子序列重复相同过程,直至子序列长度为0或1为止。
  • 在这里插入图片描述

快速排序的过程

  • 通过示例展示快速排序的初始状态和划分过程。
  • 在这里插入图片描述
  • 在这里插入图片描述

快速排序的实现

void QuickSort(ElemType L[], int s, int e) {int low = s, high = e;ElemType x = L[s];while (low < high) {while (low < high && L[high] >= x) high--;L[low] = L[high];while (low < high && L[low] < x) low++;L[high] = L[low];}L[low] = x;if (s < low - 1) QuickSort(L, s, low-1);if (high + 1 < e) QuickSort(L, high+1, e);
}

快速排序算法性能分析

  • 时间复杂度:最好情况O(nlog2n),最坏情况O(n²)。
  • 空间复杂度:最坏情况O(n),一般情况O(log2n)。

快速排序的改进

  • 选择两个轴把序列划分为三个子序列,以避免最坏情况。
  • 在这里插入图片描述

归并排序

  • 将两个或多个有序序列合并为一个新的有序序列的过程。
  • 最简单的归并排序是
    将两个有序序列合并为一个有序序列的过程,称为二路归并排序。

二路归并排序

  • 将长度为n的无序序列分成n个长度为1的有序子序列,逐步归并。
    在这里插入图片描述

合并两个有序表

  • 描述了如何将两个有序序列合并为一个新的有序序列。
  • 在这里插入图片描述

归并排序示例

  • 通过具体序列展示二路归并排序的每一趟结果。
    在这里插入图片描述

归并排序算法性能分析

  • 时间复杂度:O(nlog2n)。
  • 空间复杂度:O(n)。

各种内排序方法的比较

  • 将排序方法按平均时间分为三类:平方阶排序、线性对数阶排序、线性阶排序。
  • 平方阶O(n2)排序:一般称为简单排序,如直接插入、简单选择和冒泡排序;
  • 线性对数阶O(nlog2n)排序:如快速、堆和归并排序;
  • 线性阶O(n)排序:如基数排序。

各种内排序算法的特点

  • 对比不同排序方法的时间复杂度、空间复杂度、稳定性。
    在这里插入图片描述

总结

  • 介绍了直接插入排序、简单选择排序、快速排序、二路归并排序的思想和排序过程。
  • 展示了快速排序的一次划分过程。
  • 提供了前三种排序的算法实现。


http://www.mrgr.cn/news/7046.html

相关文章:

  • 计算机网络之IPv4深度解析
  • 【玩转python】入门篇day19-继承、多态以及单例模式
  • -Wl,-rpath= 编译器链接器指定动态库路径 与 LD_LIBRARY_PATH
  • LearnOpenGL——法线贴图、视差贴图学习笔记
  • MySQL——多表操作(一)外键(4)删除外键约束
  • # 低代码和无代码开发初探
  • 大数据与AI:驱动未来智能社会的双引擎
  • GitHub开源的PDF管理工具Stirling-pdf
  • 基于强化学习的即时商店自动化管理
  • EmguCV学习笔记 VB.Net 6.1 边缘检测
  • Modbus协议详解
  • Unity3D FixedUpdate处理物理模拟详解
  • Vmware Workstation Pro 17.5.2最新版安装-免费使用
  • CSS”包装盒“--盒模型——WEB开发系列17
  • electron 中 webPreferences 作用
  • 解决Jasper Studio报表工具中预览正常显示,但部署到服务器上面无法正常显示的问题
  • 【报错】findfont: Font family ‘SimHei‘ not found | matplotlib 不显示中文
  • Django plus Scrapy
  • 合合信息文档解析Coze插件发布,PDF转Markdown功能便捷集成
  • Python 办公自动化 案例 将Excel 数据导入数据库 【2】推荐