归并排序(C# C++)

news2025/2/13 17:27:29

目录

 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.coloradmin.cn/o/2297472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等&#xff0c;载体&#xff08;特别是涉密载体&#xff09;是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…

华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)

1 概述 KEDA&#xff08;Kubernetes-based Event-Driven Autoscaler&#xff0c;网址是https://keda.sh&#xff09;是在 Kubernetes 中事件驱动的弹性伸缩器&#xff0c;功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩&#xff0c;还支持根据各种消息队列中的长度、…

入选TPAMI2025!傅里叶变换+目标检测新突破!

今天给大家推荐一个目标检测&#xff0c;好发不卷的新思路&#xff1a;与傅里叶变换结合&#xff01; 一方面&#xff0c;不仅能提升检测的准确性和可靠性&#xff0c;还能增强模型的通用性和适应性&#xff0c;灵活应对复杂场景。比如TPAMI25的FSD模型&#xff0c;便通过该方…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展&#xff0c;智能家居逐渐成为现代生活的一部分。在众多智能家居应用中&#xff0c;智能灯光控制系统尤为重要。通过语音控制和自动调节灯光&#xff0c;用户可以更便捷地操作家中的照明设备&#xff0c;提高生活的舒适度与便利性。本文将介绍一…

等级保护2.0|网络安全服务

等级保护2.0|网络安全服务 定义 对于国家秘密信息、法人和其他组织及公民专有信息以及公开信息的存储、传输、处理这些信息系统分等级实行安全保护&#xff0c;对信息系统中发生的信息安全时间分等级响应、处置。 思想 对信息安全实行等级化保护和等级化管理 目标 突出重…

安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率

安科瑞 华楠 18706163979 在当今大力发展清洁能源的时代背景下&#xff0c;光伏发电作为一种可持续的能源解决方案&#xff0c; 正得到越来越广泛的应用。然而&#xff0c;光伏发电过程中出现的逆流问题&#xff0c;给电网的安全稳定 运行带来了诸多挑战。若不能有效解决&…

Web第二次作业_补充完小鹅通首页(静态)

目录 题目 index css style 解题 技术优势 html css 运营服务 html css 小鹅通 html css 咨询 html css 友情链接、公司信息 html css 效果展示 技术优势 运营服务 小鹅通 咨询 友情链接、公司信息 题目 index <!DOCTYPE html> <html lang…

碳纤维复合材料制造的六西格玛管理实践:破解高端制造良率困局的实战密码

碳纤维复合材料制造的六西格玛管理实践&#xff1a;破解高端制造良率困局的实战密码 在全球碳中和与高端制造升级的双重驱动下&#xff0c;碳纤维复合材料行业正经历前爆发式增长。航空航天、新能源汽车、风电叶片等领域对碳纤维产品的性能稳定性提出近乎苛刻的要求&#xff0…

在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2

文章目录 1. 安装 nvm&#xff08;如果还没有安装的话&#xff09;2. 加载 nvm 配置3. 列出特定系列的 Node.js 版本&#xff08;远程&#xff09;&#xff1a;4. 安装 Node.js 16.20.25. 使用指定版本的 Node.js6. 验证安装 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.…

tenda路由器WriteFacMac存在远程命令执行漏洞(CVE-2024-10697)

一、漏洞简介 tenda路由器WriteFacMac存在远程命令执行漏洞 二、漏洞影响 tenda路由器三、网络测绘&#xff1a; fofa: title"Tenda | LOGIN"四、复现过程 POC 1 GET /goform/WriteFacMac?macls%20%3E/webroot/1.txt HTTP/1.1 Accept: text/html,application/…

【NLP 21、实践 ③ 全切分函数切分句子】

当无数个自己离去&#xff0c;我便日益坦然 —— 25.2.9 一、jieba分词器 Jieba 是一款优秀的 Python 中文分词库&#xff0c;它支持多种分词模式&#xff0c;其中全切分方式会将句子中所有可能的词语都扫描出来。 1.原理 全切分方式会找出句子中所有可能的词语组合。对于一…

晶闸管主要参数分析与损耗计算

1. 主要参数 断态正向可重复峰值电压 :是晶闸管在不损坏的情况下能够承受的正向最大阻断电压。断态正向不可重复峰值电压 :是晶闸管只有一次可以超过的正向最大阻断电压,一旦晶闸管超过此值就会损坏,一般情况下 反向可重复峰值电压 :是指晶闸管在不损坏的情况下能够承受的…

基于Java的分布式系统架构设计与实现

Java在大数据处理中的应用&#xff1a;基于Java的分布式系统架构设计与实现 随着大数据时代的到来&#xff0c;数据处理的规模和复杂性不断增加。为了高效处理海量数据&#xff0c;分布式系统成为了必不可少的架构之一。而Java&#xff0c;凭借其平台独立性、丰富的生态系统以…

记使用AScript自动化操作ios苹果手机

公司业务需要自动化操作手机&#xff0c;本来以为很困难&#xff0c;没想到使用AScript工具出乎意料的简单&#xff0c;但是还有很多坑存在&#xff0c;写个博客记录一下。 工具信息&#xff1a; 手机&#xff1a;iphone7 系统版本&#xff1a;ios15 AScript官方文档链接&a…

Android Studio集成讯飞SDK过程中在配置Project的时候有感

在配置讯飞的语音识别SDK&#xff08;流式版&#xff09;时候&#xff0c;跟着写了两个Demo&#xff0c;一个是YuYinTestDemo01&#xff0c;另一个是02&#xff0c;demo01比较简单&#xff0c;实现功能图象也比较简陋&#xff0c;没用讯飞SDK提供的图片&#xff0c;也就是没用到…

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语&#xff08;input prompt&#xff09;以获得更优模型效果的技术。举个例子&#xff0c;如果我们想将一条英语句子翻译成德语&#xff0c;可以采用多种不同的方式向模型提问&#xff0c;如下图所示&#xf…

c#展示网页并获取网页上触发按钮的值进行系统业务逻辑处理

日前项目上遇到需要调用一个第三方的监控接口&#xff0c;给对方参数后&#xff0c;会返回一个url地址&#xff0c;我方系统需要根据用户在网页上点击的不同按钮&#xff0c;要求如下&#xff1a;在打开违规提醒窗口时&#xff0c;需要注册Callback方法&#xff08;含一个字符串…

Flappy Bird开发学习记录

概述 为了了解一下Unity的开发过程&#xff0c;或者说感受&#xff1f;先搞简单的练练手。 工具 Unity:2022.3.51f1c1 visual studio 2022 开发过程 项目基本设置 新建2d项目&#xff0c;游戏画面设置为1080*1920&#xff08;9&#xff1a;16&#xff09;。 图片素材设…

SDKMAN! 的英文全称是 Software Development Kit Manager(软件开发工具包管理器)

文章目录 SDKMAN! 的核心功能SDKMAN! 的常用命令SDKMAN! 的优势总结 SDKMAN! 的英文全称是 Software Development Kit Manager。它是一个用于管理多个软件开发工具&#xff08;如 Java、Groovy、Scala、Kotlin 等&#xff09;版本的工具。SDKMAN! 提供了一个简单的方式来安装、…

7个国内能打开的AI绘画网站!新手福音!

以下是我收集的国内能打开的AI绘画网站。 1、6pen 网址&#xff1a;https://6pen.art/ 2、文心大模型 网址&#xff1a;https://wenxin.baidu.com/moduleApi/ernieVilg 3、Draft 网址&#xff1a;https://draft.art/ai- art/drawing 4、nightcafe 网址&#xff1a;https:/…