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

算法设计-归并排序(C++)

一、简述

归并排序是一种基于分治法的高效排序算法,其核心思想是将数组分成两个子数组,分别排序后再合并。

二、详细代码

#include <iostream>
using namespace std;

void Merge(int arr[], int p, int q, int r) {
    int n1 = q - p + 1;
    int n2 = r - q;

    int* L = new int[n1];
    int* R = new int[n2];

    for (int i = 0; i < n1; i++) {
        L[i] = arr[p + i];
    }
    for (int j = 0; j < n2; j++) {
        R[j] = arr[q + 1 + j];
    }

    int i = 0, j = 0, k = p;

    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++;
    }

    delete[] L;
    delete[] R;
}

void MergeSort(int arr[], int p, int r) {
    if (p < r) { // 递归基 case
        int q = (p + r) / 2;
        MergeSort(arr, p, q);
        MergeSort(arr, q + 1, r);
        Merge(arr, p, q, r);
    }
}

int main() {
    int size;
    cout << "Enter size: ";
    cin >> size;
    int* arr = new int[size];

    for (int i = 0; i < size; i++) {
        cout << "arr element: ";
        cin >> arr[i];
    }

    int p = 0; // 从 0 开始
    int r = size - 1; // 结束为 size - 1
    MergeSort(arr, p, r);

    cout << "Sorted array: ";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    delete[] arr;
    return 0;
}

三、详细说明

Merge功能
  • Merge 函数用于合并两个已排序的子数组 arr[p..q] 和 arr[q+1..r]

参数
  • arr[]:待排序的数组。

  • p:子数组的起始索引。

  • q:子数组的中间索引。

  • r:子数组的结束索引。

变量
  • n1:左子数组的长度,n1 = q - p + 1

  • n2:右子数组的长度,n2 = r - q

  • L 和 R:临时数组,分别存储左子数组和右子数组。

  • i, j, k:循环变量,分别用于遍历左子数组、右子数组和原数组。

算法步骤
  1. 将左子数组 arr[p..q] 复制到临时数组 L

  2. 将右子数组 arr[q+1..r] 复制到临时数组 R

  3. 合并 L 和 R 到原数组 arr

    • 比较 L[i] 和 R[j],将较小的元素放入 arr[k]

    • 如果 L[i] <= R[j],则放入 L[i](保持稳定性)。

    • 否则,放入 R[j]

  4. 将剩余的元素(如果有)从 L 或 R 复制到 arr

  5. 释放临时数组 L 和 R 的内存。

MergeSort功能
  • MergeSort 函数是归并排序的主函数,用于递归地对数组进行排序。

参数
  • arr[]:待排序的数组。

  • p:子数组的起始索引。

  • r:子数组的结束索引。

算法步骤
  1. 如果 p < r,表示当前子数组至少有两个元素,需要进行排序。

  2. 计算中间索引 q = (p + r) / 2

  3. 递归调用 MergeSort 对左子数组 arr[p..q] 进行排序。

  4. 递归调用 MergeSort 对右子数组 arr[q+1..r] 进行排序。

  5. 调用 Merge 函数合并左右子数组。

四、复杂度

时间复杂度为 O(nlog⁡n),空间复杂度为 O(n)。


http://www.kler.cn/a/542648.html

相关文章:

  • 前端【技术方案】浏览器兼容问题(含解决方案、CSS Hacks、条件注释、特性检测、Polyfill 等)
  • 新站如何快速被搜索引擎收录?
  • 游戏手柄Type-c方案,支持一边充电一边传输数据
  • ES6 Proxy 用法总结以及 Object.defineProperty用法区别
  • pip3命令全解析:Python3包管理工具的详细使用指南
  • AI分支知识之机器学习,深度学习,强化学习的关系
  • Elasticsearch:如何使用 Elastic 检测恶意浏览器扩展
  • 基于GA遗传优化的电动汽车光储充电站容量配置算法matlab仿真
  • STL(八)—— stack和queue的模拟
  • DeepAR:一种用于时间序列预测的深度学习模型
  • 大语言模型安全威胁深度解析:攻击手法与实战案例
  • STM32自学记录(十)
  • 数据结构:排序—归并排序(四 )
  • 矩阵 NFC 碰一碰发视频源码搭建技术解析,支持OEM
  • STM32 HAL库 PWM程序(C语言)
  • 【02】RUST项目(Cargo)
  • 第六篇:数字逻辑的“矩阵革命”——域控制器中的组合电路设计
  • 如何将网站提交百度收录完整SEO教程
  • Ubuntu 安装 NVIDIA 驱动实操指南(含卸载)
  • 【pytest】获取所有用例名称并存于数据库
  • python tkinter实现deepseek的连接访问
  • 新一代高性能无线传输模块M-GATEWAY3
  • Flink-序列化
  • 生产环境超实用Shell脚本三
  • JAVA (Springboot) i18n国际化语言配置
  • JVM 中的各种收集器总结