C++归并排序代码实现示例代码

2025-08-09 21:50

本文主要是介绍C++归并排序代码实现示例代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的...

1 算法核心思想

归并排序是一种高效的排序方式,需要用到递归来实现,我们先来看一下动图演示:

C++归并排序代码实现示例代码

算法核心思想如下:

1.将数组尽量平均分成两段。

2.将这两段都变得有序(使用递归实现)。

3.将两段合并。

2 代码实现

首先,我们先定义一个归并排序的函数,里面接受三个参数:

void MergeSort(int arr[], int left, int right) {
    
}

arr代表需要进行排序的数组,left表示数组arr的最左端点,right表示数组arr的最右端点。

首先我们需要把数组分成两段,我们可以用二分的方法:

int mid = (left + right) >> 1;

这里右移(>>为右移运算符)1为和除以2含义相同。

也可以用防溢出,因为left+right的值可能会爆int,导致结果错误:

int mid python= left + (right - left) >> 1;

然后对两段分别进行递归,第一段是[1, mid],第二段是[mid+1, right]:

MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);

由于我们需要对数组进行操作,但是直接在arr操作可能会导致原始数据丢失,但是如果再创建一个数组会占用内存,所以我们可以向电脑“租借”right-left+1个空间,用关键字new来完成:

int* tmp = new int[right - left + 1];

注意要以指针的形式定义。

由于我们要把数组变得有序,而我们归并排序的思想就是分而治之,然后再依次变得有序,需要用到分治的思想。那么我们先定义一些变量:

int cur = 0, cur1 = left, cur2 = mid + 1;

cur为tmp数组的元素下标,cur1为第一段的最左端点,cur2为第二段的最左端点。

然后我们对tmp数组和arr数组android进行循环操作,这里可以用while循环,循环条件是cur1<=mid&&cur2<=right。

如果arr[cur1]比arr[cur2]更大,那么就先把arr[cur2]放回tmp,否则放arr[cur1]。

代码:

while(cur1 <= mid && cur2 <= right)
{
    if(arr[cur1] < arr[cur2]http://www.chinasem.cn)
        tmp[cur++] = arr[cur1++];
    else
        tmp[cur++] = arr[cur2++];
}

然后处理可能有的数组残余未处理的部分:

while(cur1 <= mid)
    tmp[cur++] = arr[cur1++];
while(cur2 <= right)
    tmp[cur++] = arr[cur2++];

然后合并数组,方法跟处理时差不多的:

fChina编程or(int i = 0; i < right - left + 1; i++)
    arr[left + i] = tmp[i];

就是把tmp的元素依次赋值给arr。

最有我们需要把tmp的空间还给内存,所以我们delete一下:

delete[] tmp;

然后我们的arr就变的有序了。

但是,如果android这样写,程序就成功被我们干崩了,因为我们忘记写递归出口了,补一个递归出口:

if(left == right)
    return;

我们合并一下整段代码:

void MergeSort(int arr[], int left, int right) {
    if(left == right)
        return;
    int mid = (left + right) >> 1;
    MergeSort(arr, left, mid);
    MergeSort(arr, mid + 1, right);
    int* tmp = new int[right - left + 1];
    int cur = 0, cur1 = left, cur2 = mid + 1;
    while(cur1 <= mid && cur2 <= right)
    {
        if(arr[cur1] < arr[cur2])
            tmp[cur++] = arr[cur1++];
        else
            tmp[cur++] = arr[cur2++];
    }
    while(cur1 <= mid)
        tmp[cur++] = arr[cur1++];
    while(cur2 <= right)
        tmp[cur++] = arr[cur2++];
    for(int i = 0; i < right - left + 1; i++)
        arr[left + i] = tmp[i];
    delete[] tmp;
}

3 算法时间复杂度

正常情况下,归并排序时间复杂度为:

O(NLogN)

到此这篇关于C++归并排序代码实现的文章就介绍到这了,更多相关C++归并排序内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于C++归并排序代码实现示例代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155651

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter