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

归并排序——二路归并排序

目录

1、简述

2、复杂度

3、稳定性

4、例子


1、简述

二路归并排序(Merge Sort)是一种基于分治法的排序算法,通过将数组递归地拆分成两部分,分别排序后再合并,从而实现整个数组的有序。二路归并排序具有稳定性和高效性,是一种非常经典的排序算法。

实现步骤

  1. 分割
    • 将数组分成两部分,分别对每部分进行递归排序。
  2. 合并
    • 将两个已排序的部分合并成一个有序的整体。

2、复杂度

  • 时间复杂度

    • 最佳情况:O(n log n)
    • 最坏情况:O(n log n)
    • 平均情况:O(n log n)
  • 空间复杂度

    • O(n),需要额外的存储空间来合并两个子数组。

3、稳定性

归并排序是一种稳定的排序算法,因为在合并时保持了相同元素的相对顺序。

4、例子

#include <iostream>
#include <vector>// 合并两个有序子数组
void merge(std::vector<int>& arr, int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;// 创建临时数组std::vector<int> L(n1);std::vector<int> R(n2);// 复制数据到临时数组 L[] 和 R[]for (int i = 0; i < n1; ++i)L[i] = arr[left + i];for (int i = 0; i < n2; ++i)R[i] = arr[mid + 1 + i];// 合并临时数组到原数组int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];++i;} else {arr[k] = R[j];++j;}++k;}// 复制剩余元素(如果有)while (i < n1) {arr[k] = L[i];++i;++k;}while (j < n2) {arr[k] = R[j];++j;++k;}
}// 递归实现归并排序
void mergeSort(std::vector<int>& arr, int left, int right) {if (left < right) {int mid = left + (right - left) / 2;// 递归排序两个子数组mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);// 合并两个已排序的子数组merge(arr, left, mid, right);}
}// 测试代码
int main() {std::vector<int> array = {12, 11, 13, 5, 6, 7};mergeSort(array, 0, array.size() - 1);std::cout << "Sorted array is \n";for (int num : array)std::cout << num << " ";std::cout << std::endl;return 0;
}

 快捷跳转: 

  • 排序算法概述

生命不息,学习不止,若有不正确的地方,欢迎指正。

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

相关文章:

  • java-StringBuilder
  • 数据结构 | 超详细讲解七大排序(C语言实现,含动图,多方法!)
  • 企业自建邮件系统的优势,安全性更高,功能更灵活,维护更便捷
  • Softing工业助力微软解锁工业数据,推动AI技术在工业领域的发展
  • 企微自动化机器人的应用与前景
  • 从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件
  • 基于RNN和Transformer的词级语言建模 代码分析 log_softmax
  • Python爬虫要掌握哪些东西
  • FPGA-ARM架构与分类
  • docker网络详解
  • 设计软件有哪些?效果工具篇(1),渲染100邀请码1a12
  • Iphone自动化指令每隔固定天数打开闹钟关闭闹钟(二)
  • 计算机网络错题答案汇总
  • Fortigate防火墙二层接口的几种实现方式
  • 如何永久擦除Android手机中的所有个人数据?
  • 使用手机小程序给证件照换底色
  • C语言杂谈:函数栈帧,函数调用时到底发生了什么
  • 【Qt】win10,QTableWidget表头下无分隔线的问题
  • 前端 实现有时间限制的缓存
  • 前端将xlsx转成json
  • 使用LLaMA-Factory微调大模型
  • C语言二级指针、指针数组
  • python方法
  • 0基础学习区块链技术——去中心化
  • 索引的强大作用和是否创建的索引越多越好
  • 批量GBK转UTF-8
  • C#WPF数字大屏项目实战08--生产量/良品统计
  • 22、matlab锯齿波、三角波、方波:rectpuls()函数/sawtooth()函数/square()函数
  • 手机和WINDOWS电脑蓝牙连接后怎样放歌,无法选择媒体音频 蓝牙媒体音频勾选不上
  • MatrixOne→MatrixOS:矩阵起源的创业史即将用“AI Infra”和“AI Platform”书写新章程