归并排序(C# C++)

ops/2025/2/13 5:35:26/

目录

 1  归并排序的基本概念

 2  算法步骤

 2-1  分解阶段

 2-2  合并阶段

 3  代码实现

 3-1  C#代码示例(该代码在unity环境下)

 3-2  C++代码示例


 1  归并排序的基本概念

归并排序(Merge Sort)是一种经典的分治算法,由约翰・冯・诺伊曼在 1945 年提出。它的核心思想是将一个大问题分解为多个相似的小问题,然后分别解决这些小问题,最后将小问题的解合并起来得到原问题的解。

 2  算法步骤

归并排序主要分为两个阶段:分解阶段和合并阶段。

 2-1  分解阶段
  • 分解过程:从数组的中间位置将数组分成两个子数组,不断递归地对这两个子数组进行同样的分解操作,直到每个子数组中只有一个元素(因为单个元素的数组本身就是有序的)。
  • 示例:假设有数组 [8, 4, 5, 7, 1, 3, 6, 2],首先将其从中间分成 [8, 4, 5, 7][1, 3, 6, 2],然后对这两个子数组继续分解,如 [8, 4, 5, 7] 会被分解为 [8, 4][5, 7],依此类推,直到每个子数组只有一个元素。
 2-2  合并阶段
  • 合并过程:将两个有序的子数组合并成一个有序的数组。比较两个子数组的第一个元素,将较小的元素放入新数组,然后移动该子数组的指针,继续比较,直到其中一个子数组的元素全部放入新数组,最后将另一个子数组剩余的元素依次放入新数组。
  • 示例:假设有两个有序子数组 [4, 8][5, 7],比较 4 和 5,将 4 放入新数组,然后比较 8 和 5,将 5 放入新数组,接着比较 8 和 7,将 7 放入新数组,最后将 8 放入新数组,得到合并后的有序数组 [4, 5, 7, 8]

 3  代码实现

 3-1  C#代码示例(该代码在unity环境下)
        private int GetAndIncrement(int[] arr, ref int index){int value = arr[index];index++;return value;}private int[] Sort(int[] left, int[] right){//先准备一个新数组var array = new int[left.Length + right.Length];var leftIndex = 0;var rightIndex = 0;for (var i = 0; i < array.Length; i++){//左侧放完了,直接放对面if (leftIndex >= left.Length)array[i] = GetAndIncrement(right, ref rightIndex);else if (rightIndex >= right.Length) array[i] = GetAndIncrement(left, ref leftIndex);else if (left[leftIndex] < right[rightIndex])array[i] = GetAndIncrement(left, ref leftIndex);else array[i] = GetAndIncrement(right, ref rightIndex);}return array;}private int[] Merge(int[] array){if (array.Length < 2) return array;int mid = array.Length / 2;int[] left = new int[mid];int[] right = new int[array.Length - mid];for (int i = 0; i < array.Length; i++){if (i < mid) left[i] = array[i];else right[i - mid] = array[i];}return Sort(Merge(left), Merge(right));}

测试程序

 3-2  C++代码示例
#include <iostream>
#include <vector>int GetAndIncrement(const std::vector<int>& arr, int& index) {int value = arr[index];index++;return value;
}std::vector<int> Sort(const std::vector<int>& left, const std::vector<int>& right) {std::vector<int> array(left.size() + right.size());int leftIndex = 0;int rightIndex = 0;for (size_t i = 0; i < array.size(); ++i) {if (leftIndex >= left.size()) {array[i] = GetAndIncrement(right, rightIndex);} else if (rightIndex >= right.size()) {array[i] = GetAndIncrement(left, leftIndex);} else if (left[leftIndex] < right[rightIndex]) {array[i] = GetAndIncrement(left, leftIndex);} else {array[i] = GetAndIncrement(right, rightIndex);}}return array;
}std::vector<int> Merge(const std::vector<int>& array) {if (array.size() < 2) {return array;}size_t mid = array.size() / 2;std::vector<int> left(array.begin(), array.begin() + mid);std::vector<int> right(array.begin() + mid, array.end());return Sort(Merge(left), Merge(right));
}int main() {std::vector<int> array = {12, 34, 54, 2, 3};std::cout << "排序前的数组: ";for (int num : array) {std::cout << num << " ";}std::cout << std::endl;std::vector<int> sortedArray = Merge(array);std::cout << "排序后的数组: ";for (int num : sortedArray) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

运行结果:


http://www.ppmy.cn/ops/157969.html

相关文章

二、数据持久化篇(深度增强版)

二、数据持久化篇&#xff08;深度增强版&#xff09; 2.1 JDBC Template深度解析 架构设计思想 #mermaid-svg-y2IrKiVu2gzenoCB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-y2IrKiVu2gzenoCB .error-icon{fil…

JEECGBOOT前端VUE3版本浏览器兼容支持chrome>=76版本方法

JEECGBOOT最新的前端VUE3版本使用的 VITE最新版本Ant design vue最新版本。 部署到生产环境以后发现&#xff0c;chrome76-100左右&#xff0c;CSS样式会乱掉失效&#xff0c;不太兼容&#xff0c;103以上的没问题。 尝试了三种方法&#xff0c;前两种都失败了&#xff0c;第三…

MVCC面试怎么答

说到mvcc这个比较抽象的概念&#xff0c;很多人都有点束手无策。因为它实际上偏理论&#xff0c;实际应用中很难用到。但在面试中出现频率又很高&#xff0c;一问大部分都G。所以怎么精简回答并且能抓住重点就很关键了。往上详细解说MVCC的太多了&#xff0c;我这里没那么多废话…

最新版Edge浏览器集成ActiveX控件之金山WpsDocFrame控件

背景 WpsDocFrame控件‌是由金山公司开发的ActiveX控件&#xff0c;主要用于OA系统中&#xff0c;支持在浏览器中嵌入WPS文档的查看和编辑功能。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有…

问卷数据分析|SPSS实操之单因素方差分析

适用条件&#xff1a; 检验分类变量和定量变量之间的差异 分类变量数量要大于等于三 具体操作&#xff1a; 1.选择分析--比较平均值--单因素ANOVA检验 2. 下方填分类变量&#xff0c;上方为各个量表数据Z1-Y2 3. 点击选项&#xff0c;选择描述和方差齐性检验 4.此处为结果数…

Pandas数据填充(fill)中的那些坑:避免机器学习中的数据泄露

1. 问题背景 在处理时间序列数据时,经常会遇到缺失值需要填充。Pandas提供了ffill(forward fill)和bfill(backward fill)两种填充方式,但使用不当可能会导致数据泄露,特别是在进行机器学习预测时。 2. 填充方式解析 2.1 基本概念 ffill(forward fill): 用前面的值填充后面的…

objectArx2016使用python3.9.7配置实践

写在前面: 笔者有一些python代码, 需要结合到cad二次开发的项目中,并使用embed版本进行发布.记录一下配置过程,并加些分析,以备后期查用. ObjectArx配置Python 零 着重提醒一 Python安装版本和embed版本1.1 下载1.2 安装版本的设置1)安装参数设置2)安装版本Python内重要文件 1.…

机器学习中过拟合和欠拟合问题处理方法总结

目录 一、背景二、过拟合(Overfitting)2.1 基本概念2.2 过拟合4个最主要的特征2.3 防止过拟合的11个有效方法 三、欠拟合&#xff08;Underfitting&#xff09;3.1 基本概念3.2 欠拟合的4个特征3.3 防止欠拟合的11个有效方法 四、总结五、参考资料 一、背景 在机器学习模型训练…