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

 更新时间:2025年08月09日 11:52:13   作者:乾坤未定的黑马  
归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,这篇文章主要介绍了C++归并排序代码实现的相关资料,需要的朋友可以参考下

1 算法核心思想

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

算法核心思想如下:

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 = 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数组进行循环操作,这里可以用while循环,循环条件是cur1<=mid&&cur2<=right。

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

代码:

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];

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

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

delete[] tmp;

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

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

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++归并排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 变量的声明和初始化方式示例详解

    C++ 变量的声明和初始化方式示例详解

    在 C++ 中,直接初始化和复制初始化之间有一些微妙的区别,通常,直接初始化更加高效并且可以用于更多的情况,因为它在声明的同时就执行了初始化操作,这篇文章主要介绍了C++ 变量的声明和初始化方式示例,需要的朋友可以参考下
    2024-06-06
  • Qt中QCommandLinkButton控件的使用

    Qt中QCommandLinkButton控件的使用

    QCommandLinkButton 是 Qt 框架中 QtWidgets 模块的一个类,它提供了一个结合了文本标签和按钮功能的控件,本文主要介绍了Qt中QCommandLinkButton控件的使用,感兴趣的可以了解一下
    2025-04-04
  • Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例

    Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例

    这篇文章主要介绍了Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例,需要的朋友可以参考下
    2020-03-03
  • Eclipse中C++连接mysql数据库

    Eclipse中C++连接mysql数据库

    这篇文章主要为大家详细介绍了Eclipse中C++连接mysql数据库 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • C++动态规划之最长公子序列实例

    C++动态规划之最长公子序列实例

    这篇文章主要介绍了C++动态规划之最长公子序列,实例分析了C++求最长公子序列的相关技巧,是C++字符串操作的一个典型应用,需要的朋友可以参考下
    2015-04-04
  • C++实现FTP综合应用详解

    C++实现FTP综合应用详解

    这篇文章主要为大家详细介绍了C++实现FTP综合应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言超全面讲解函数的使用方法上

    C语言超全面讲解函数的使用方法上

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数,由于篇幅过大,分为两篇讲解,下面开始上篇
    2022-04-04
  • C++实现打印虚函数表的地址

    C++实现打印虚函数表的地址

    对于存在虚函数的类,如何打印虚函数表的地址,并利用这个虚函数表的地址来执行该类中的虚函数呢,下面小编就来和大家一起简单聊聊吧
    2023-07-07
  • 桶排序算法的理解及C语言版代码示例

    桶排序算法的理解及C语言版代码示例

    桶排序算法顾名思义,就是把要排序的元素分桶排序后合并结果,这里我们就来看一下桶排序算法的理解及C语言版代码示例:
    2016-07-07
  • 怎么通过C语言自动生成MAC地址

    怎么通过C语言自动生成MAC地址

    以下是对使用C语言自动生成MAC地址的实现代码进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09

最新评论