8.5 归并排序和基数排序

news/2025/3/28 22:53:55/文章来源:https://www.cnblogs.com/againss/p/18792172

1. 归并排序

核心思想

  1. 分解,将待排序序列递归地分成两个子序列,直到每个子序列仅含有一个元素(此时天然有序)。
  2. 将两个有序子序列合并成为一个更大的有序序列,最终得到完整的有序序列。

实现代码(C语言实现)

  1. 迭代实现归并排序的代码
void Merge(int arr[], int low, int mid, int high) {int i = low, j = mid + 1, k = 0;int *temp = (int *)malloc((high - low + 1) * sizeof(int)); // 辅助数组while (i <= mid && j <= high) {if (arr[i] <= arr[j]) temp[k++] = arr[i++]; // 保证稳定性else temp[k++] = arr[j++];}// 处理剩余元素while (i <= mid) temp[k++] = arr[i++];while (j <= high) temp[k++] = arr[j++];// 将temp数组拷贝回原数组for (i = low, k = 0; i <= high; i++, k++) {arr[i] = temp[k];}free(temp);
}void MSort(int arr[], int low, int high) {if (low < high) {int mid = (low + high) / 2;MSort(arr, low, mid);      // 递归左半部分MSort(arr, mid + 1, high); // 递归右半部分Merge(arr, low, mid, high); // 合并}
}void MergeSort(int arr[], int n) {MSort(arr, 0, n - 1);
}

  1. 非递归实现的归并排序
// 合并两个有序子数组
void Merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int *L = (int *)malloc(n1 * sizeof(int));int *R = (int *)malloc(n2 * sizeof(int));// 拷贝数据到临时数组for (int i = 0; i < n1; i++) L[i] = arr[left + i];for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];// 合并int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) arr[k++] = L[i++];else arr[k++] = R[j++];}// 处理剩余元素while (i < n1) arr[k++] = L[i++];while (j < n2) arr[k++] = R[j++];free(L);free(R);
}// 非递归归并排序
void MergeSort(int arr[], int n) {for (int step = 1; step < n; step *= 2) {          // 子数组长度从1开始翻倍for (int left = 0; left < n - 1; left += 2 * step) {int mid = left + step - 1;int right = (left + 2 * step - 1) < (n - 1) ? (left + 2 * step - 1) : (n - 1);Merge(arr, left, mid, right);             // 合并相邻子数组}}
}

归并排序的特点

  1. 归并排序具有稳定性,可以用于需要保持关键字原始顺序的场景。

  2. 可以用于大数据排序(外部排序,具体见\(\rightarrow\)8.7.外部排序),链表排序(无需随机访问,合并操作非常适合链表结构)。

  3. 不适用于有内存限制的问题(需要\(O(n)\))的辅助空间,也不适用于实时系统(递归调用和空间开销较大)。

  4. 虽然归并排序和快速排序的时间复杂度相同,但是归并排序的常数因子较大,实际运行可能慢于快速排序。

2. 基数排序

待补······

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】堆(大根堆、小根堆)的C++代码模板

大根堆/最大堆 以下是 大根堆(Heap)的C++代码模板,包含最大堆的基本操作(插入、删除堆顶、堆化等),注释详细说明关键步骤: class MaxHeap { private:vector<int> heap;// 获取父节点索引int parent(int i) { return (i - 1) / 2; }// 获取左子节点索引int left(in…

简易聊天室项目(本地部署)

二、IDEA开发 1.创建新的空项目file->project struture->+->new module点击next,选取依赖创建成功后,先将依赖下载(右上角会有一个小的m图标,点击就可以)2.创建文件 先创建三个文件ChatHandler,WebSocketConfig,index.html,位置如下3.粘贴代码,将下面代码粘贴…

20234114 2024-2025-2 《Python程序设计》实验一报告

20234114 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2341 姓名: 于家欢 学号:20234114 实验教师:王志强 实验日期:2025年3月21日 必修/选修: 公选课 1.实验内容熟悉Python开发环境;练习Python运行、调试技能;编写程序,练习变量和类型…

简易聊天室项目(环境搭建)

从零搭建简易聊天室项目 一.开发环境搭建 1.安装jdk23 访问 Oracle官网 或 OpenJDK镜像站下载,搜索安装教程安装配置 2.安装IDEA 访问 JetBrains官网下载社区版(免费)或旗舰,搜索安装教程安装配置 3.安装MAVEN 可参考b站视频安装 1)下载 访问Maven官网找到自己下载的压缩包…

L2 领导力

Hina...L2 领导力 需求层次 理论 人类受到各种需求的驱动。人是一种追求完全需求的动物。 管理设计对人力资源——我们的同事——的激活,来实现既定的目标,这是通过满足人类的各种需求来操纵人的行为做到的。 马斯洛的需求层次理论指出,一些需求比其他需求更基本,只有在基本…

Crypto类型总结(持续更新)

想做这样的一篇密码学总结的文章的想法主要来自于https://blog.csdn.net/weixin_45728976/article/details/109219997 这篇文章,对于这篇文章里面已经涉及到的内容的基础点不再进行繁琐的讲论。 接下来总结的主要是各种各样的crypto的魔改或者容易忘却的思路 1.unencode加密:…

树链剖分-重链剖分

树链剖分——重链剖分,我学的第一个蓝色算法树链剖分-重链剖分 前置知识 树形结构,链式前向星,线段树,DFS序,LCA 定义 树链剖分(树剖):将树分解为一条条不相交的,从祖先到孙子的链。 第零部分:建树与基本概念 建树:给定\(n\)个节点用链式前向星(或邻接表)建树 基本…

苍穹外卖-day05

redis基本入门 入门略过https://www.bilibili.com/video/BV1TP411v7v6?spm_id_from=333.788.videopod.episodes&vd_source=93f5f50fb9ce34ddae7abba08c6ea064&p=62 50-62级 记了感觉也不会看每次使用redis时需要先启动服务 在redis目录下,进入cmd窗口,输入以下命令启…

2025最新面试题-JVM面试题(二)

堆为什么进行分代设计老年代的担保机制 为什么Eden:S0:S1 是8:1:1 对象的创建以及分配过程方法区与元数据区以及持久代到底是什么关系? Full GC = young GC + Old GC + Meta Space GC 规范:方法区 实现: JDK1.7之前 永久代 持久代 Perm Space 类的总数 常量池大小 方法的…

YashanDB双引号

双引号是对标识符、密码定义和使用的扩展。使用双引号时,标识符、密码定义将支持特殊字符、数字,并且区分字母大小写。 双引号的使用位置(是否可出现在SELECT,FROM和WHERE后)和使用场景规则,以及双引号内字符串的长度限制,由双引号限定的标识符和密码本身决定,与是否加…

YashanDB故障状态

YashanDB检测到异常故障时,防止扩散影响,会将数据库的状态置为ABNORMAL,数据库处于故障只读状态,可以查询,不能执行写的业务。 当数据库为ABNORMAL状态时,可以查看V$DIAG_INCIDENT视图或告警日志明确故障原因。 --故障发生时,数据库状态为ABNORMAL SELECT STATUS FROM V…