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

归并排序(C# C++)

目录

 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.kler.cn/a/543669.html

相关文章:

  • 一致性Hash算法延伸至Redis分片扩容使Lua脚本失效如何解决
  • 用语言模型探索语音风格空间:无需情感标签的情 感TTS
  • 使用 Flask 构建流式返回服务
  • 基于Java的分布式系统架构设计与实现
  • STM32 HAL库 CANbus通讯(C语言)
  • 京东广告生成式召回基于 NVIDIA TensorRT-LLM 的推理加速实践
  • React 什么时候会触发重新渲染?
  • 【设计模式】01- 一文理解常用设计模式-“创建型模式”篇
  • vue error Expected indentation of 2 spaces but found 4 indent
  • 好好说话:深度学习扫盲
  • 搜维尔科技在动作捕捉与动画制作、汽车制造与安全测试、机器人与自动化领域的一些案例
  • chromium-mojo
  • python 获取smpl身高 fbx身高
  • 数据仓库与数据挖掘记录 一
  • iOS主要知识点梳理回顾-3-运行时消息机制
  • leetcode 面试经典 150 题:跳跃游戏 II
  • NeRF与3D Gaussian的异同对比
  • MySQL 实战 4 种将数据同步到ES方案
  • kotlin标准库里面也有很多java类
  • 解锁大语言模型潜能:KITE 提示词框架全解析
  • 一区IEEE Trans|特征模态分解FMD,一维数据分解新方法-matlab免费代码
  • C#/.NET/.NET Core技术前沿周刊 | 第 24 期(2025年1.27-1.31)
  • PyCharm控制台中文乱码
  • MongoDB 的基本概念
  • 跟着李沐老师学习深度学习(八)
  • 计算机网络综合实训室解决方案(2025年最新版)