c++实现二路归并排序的示例代码

C++实现二路归并排序是一种常用的排序算法,本文将介绍该算法的详细实现过程,并提供一些示例说明。

一、简述二路归并排序的原理

二路归并排序是一种基于分治思想的排序算法。核心思想是把一个待排序的序列,不断地拆分为两个子序列,直至每个子序列只剩下一个元素,然后利用递归思想将这些子序列不断地两两合并,最终得到一个有序的序列。

二、C++实现二路归并排序的示例代码

代码如下:

#include <iostream>

using namespace std;

void merge(int arr[], int l, int m, int r)
{
    int n1 = m - l + 1;
    int n2 = r - m;

    int L[n1], R[n2];

    for(int i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for(int i = 0; i < n2; i++)
        R[i] = arr[m + 1 + i];

    int i = 0, j = 0, k = l;
    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++;
    }
}

void mergeSort(int arr[], int l, int r)
{
    if(l < r)
    {
        int m = l + (r - l) / 2;

        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);

        merge(arr, l, m, r);
    }
}

void printArray(int arr[], int size)
{
    for(int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

int main()
{
    int arr[] = {38, 27, 43, 3, 9, 82, 10};
    int size = sizeof(arr) / sizeof(arr[0]);

    cout << "Original array: ";
    printArray(arr, size);

    mergeSort(arr, 0, size - 1);

    cout << "Sorted array: ";
    printArray(arr, size);

    return 0;
}

三、示例说明

示例一

输入: {38, 27, 43, 3, 9, 82, 10}

输出: {3, 9, 10, 27, 38, 43, 82}

解释:将元素依次分割为: {38, 27, 43, 3}, {9, 82, 10},继续分割为 {38, 27}, {43, 3}, {9, 82}, {10},分割完成后,开始将元素进行排序合并。第一次合并为 {27, 38}, {3, 43}, {9, 82}, {10},第二次合并为 {3, 27, 38, 43}, {9, 10, 82},最后一次合并为 {3, 9, 10, 27, 38, 43, 82},得到了一个有序的数组。

示例二

输入: {7, 5, 9, 3, 1, 4, 6, 8, 2}

输出: {1, 2, 3, 4, 5, 6, 7, 8, 9}

解释:将元素依次分割为: {7, 5, 9, 3, 1}, {4, 6, 8, 2},继续分割为 {7, 5}, {9, 3, 1}, {4, 6}, {8, 2},分割完成后,开始将元素进行排序合并。第一次合并为 {5, 7}, {1, 3, 9}, {4, 6}, {2, 8},第二次合并为 {1, 3, 5, 7, 9}, {2, 4, 6, 8},最后一次合并为 {1, 2, 3, 4, 5, 6, 7, 8, 9},得到了一个有序的数组。

综上所述,通过归并排序,可以将一个无序的数组转换为一个有序的数组,其时间复杂度为O(nlogn)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++实现二路归并排序的示例代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 堆排序原理及算法代码详解

    堆排序原理及算法代码详解 堆排序属于一种选择排序,它的基本思想是利用堆这种数据结构来进行排序。 堆的概念 堆(Heap)是一个特殊的树形数据结构,它有以下两种类型: 大根堆:每个节点的值都大于或等于其左右孩子节点的值。 小根堆:每个节点的值都小于或等于其左右孩子节点的值。 通过对堆进行操作,可以得到堆排序算法。 堆排序的基本思想 将待排序序列构造成一个大根堆…

    算法与数据结构 2023年5月19日
    00
  • Javascript实现快速排序(Quicksort)的算法详解

    Javascript实现快速排序的算法详解 在这个攻略中,我们将通过Javascript实现快速排序算法,并讲解算法的详细过程。 快速排序的基本思想 快速排序是一种基于交换的排序算法,其基本思想是通过选择一个基准元素,在一趟排序过程中,将之前需要排序的序列中的元素分割成两个部分,其中,左边部分元素的值都小于基准元素的值,右边部分元素的值都大于基准元素的值,然…

    算法与数据结构 2023年5月19日
    00
  • MybatisPlus中的insert操作详解

    MybatisPlus 是 MyBatis 的增强工具包,可以极大地简化 MyBatis 的操作。其中包括许多基础操作,例如insert、update、delete、select等操作。在这里,我们将详细讲解 MybatisPlus 中的 insert 操作。 什么是 MybatisPlus 中的 insert 操作? MybatisPlus 中的 inse…

    算法与数据结构 2023年5月19日
    00
  • java ArrayList按照同一属性进行分组

    要按照同一属性进行分组,我们需要用到Java中的Collections类和Comparator接口。 首先,我们需要为ArrayList中的对象定义一个属性,以便按照该属性进行分组。例如,我们定义一个Person类,其中包含name和age两个属性,我们想要按照年龄进行分组。则代码如下: public class Person { private Strin…

    算法与数据结构 2023年5月19日
    00
  • C#归并排序的实现方法(递归,非递归,自然归并)

    下面是关于C#归并排序的实现方法的完整攻略: 什么是归并排序? 归并排序是一种基于分治法的算法,具体实现方法是将原序列分成若干个子序列,分别进行排序,然后将排好序的子序列合并成一个大的有序序列。 递归实现归并排序 递归实现归并排序分为三步: 分解数组:将要排序的数组从中间分成两个部分,即分为左右两个子数组。这里使用数组下标来实现。 递归排序子数组:对分解出来…

    算法与数据结构 2023年5月19日
    00
  • C++超详细讲解贪心策略的设计及解决会场安排问题

    C++超详细讲解贪心策略的设计及解决会场安排问题 什么是贪心算法 贪心算法是一种近似算法,通常用于求解最优化问题。在每一步,贪心算法总是做出在当前看来最优的选择,并希望通过这样的选择最终能达到全局最优。 解决会场安排问题的贪心策略 问题描述 为了方便会议的安排,需要一个会议室来容纳所有的会议。现在有n个会议需要在会议室中安排,假设每个会议被安排在一个时间段内…

    算法与数据结构 2023年5月19日
    00
  • C++详细讲解图的拓扑排序

    C++详细讲解图的拓扑排序 什么是拓扑排序 拓扑排序是对于有向无环图(Directed Acyclic Graph)的一种排序,其输出结果为图中每个节点的线性先后序列,满足如果存在一条从节点 A 到节点 B 的路径,则在序列中节点 A 出现在节点 B 的前面。 什么是有向无环图(DAG) 有向无环图是不包含环路并且有一个或多个源点和汇点的有向图。其中源点指没…

    算法与数据结构 2023年5月19日
    00
  • C语言实现排序算法之归并排序详解

    C语言实现排序算法之归并排序详解 概述 归并排序是一种分治算法,在处理大规模数据排序时具有较高的效率。该算法将要排序的数组分为两部分,对每个部分内部进行排序,然后将排好序的两部分合并成一个有序数组。该算法在实现时需要借助递归和迭代两种方式。 步骤 归并排序可递归或迭代实现。以下是递归实现的步骤: 分解:将待排序数组分为两个等长的子数组,分别为左半部分和右半部…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部