C++实现自顶向下的归并排序算法

下面是“C++实现自顶向下的归并排序算法”的完整攻略。

归并排序的概念

归并排序是一种分治法排序算法,它将一个大数组分成两个部分,分别对这两个部分进行排序,最后将两个排好序的部分合并起来。归并排序的时间复杂度为O(n log n)。

归并排序的步骤

实现归并排序需要以下三个步骤:

  1. 分割 - 将数组分成两个部分,分别对每个部分进行排序。该过程使用二分法来实现。递归调用直到只有一个元素或一个空数组。

  2. 合并 - 将两个排好序的部分合并起来。该过程使用两个指针遍历两个数组,并将它们按从小到大的顺序合并。

  3. 排序 - 将数组划分为两个部分,分别对每个部分进行排序并合并。递归调用直到只有一个元素或一个空数组。

C++实现自顶向下的归并排序算法

以下是C++实现自顶向下的归并排序算法的完整代码:

#include <iostream>
using namespace std;

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

    int arr1[n1], arr2[n2];

    for(int i = 0; i < n1; i++)
        arr1[i] = arr[l + i];

    for(int i = 0; i < n2; i++)
        arr2[i] = arr[mid + 1 + i];

    int i = 0, j = 0, k = l;
    while(i < n1 && j < n2) {
        if(arr1[i] <= arr2[j]) {
            arr[k] = arr1[i];
            i++;
        }
        else {
            arr[k] = arr2[j];
            j++;
        }
        k++;
    }

    while(i < n1) {
        arr[k] = arr1[i];
        i++;
        k++;
    }

    while(j < n2) {
        arr[k] = arr2[j];
        j++;
        k++;
    }
}

void merge_sort(int arr[], int l, int r) {
    if(l >= r)
        return;

    int mid = l + (r - l) / 2;
    merge_sort(arr, l, mid);
    merge_sort(arr, mid + 1, r);
    merge(arr, l, mid, r);
}

int main() {
    int arr[] = {5, 4, 3, 2, 1};
    int n = sizeof(arr) / sizeof(arr[0]);
    merge_sort(arr, 0, n - 1);

    for(int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;

    return 0;
}

在上面的代码中,merge()函数用于将两个已排好序的数组合并到一起。merge_sort()函数实现了整个排序过程,将数组分成两个部分,分别对每个部分进行排序并合并。

示例说明

下面是两个示例来说明归并排序的过程。

  1. 对数组{5, 4, 3, 2, 1}进行排序。

  2. 输入:{5, 4, 3, 2, 1}

  3. 第一次分割:{5, 4, 3} {2, 1}
  4. 第二次分割:{5} {4, 3} {2} {1}
  5. 第三次分割:{5} {4} {3} {2} {1}
  6. 合并:{4, 5} {2, 3} {1}
  7. 合并:{2, 3, 4, 5} {1}
  8. 合并:{1, 2, 3, 4, 5}
  9. 输出:{1, 2, 3, 4, 5}

  10. 对数组{45, 23, 11, 89, 77, 98, 4, 28}进行排序。

  11. 输入:{45, 23, 11, 89, 77, 98, 4, 28}

  12. 第一次分割:{45, 23, 11, 89} {77, 98, 4, 28}
  13. 第二次分割:{45, 23} {11, 89} {77, 98} {4, 28}
  14. 第三次分割:{45} {23} {11} {89} {77} {98} {4} {28}
  15. 合并:{23, 45} {11, 89} {77, 98} {4, 28}
  16. 合并:{11, 23, 45, 89} {4, 28, 77, 98}
  17. 合并:{4, 11, 23, 28, 45, 77, 89, 98}
  18. 输出:{4, 11, 23, 28, 45, 77, 89, 98}

以上就是C++实现自顶向下的归并排序算法的完整攻略和两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现自顶向下的归并排序算法 - Python技术站

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

相关文章

  • C#算法之全排列递归算法实例讲解

    C#算法之全排列递归算法实例讲解 什么是全排列? 全排列是指将一个给定的集合中的元素进行排列,使得每个元素只出现一次,且每个元素在排列中的位置是不确定的,从而得到的所有不同排列。比如给定集合{1, 2, 3}的全排列包括{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}和{3, 2, 1}。 递归算法实现全排列…

    算法与数据结构 2023年5月19日
    00
  • C++中sort函数的基础入门使用教程

    以下是详细讲解“C++中sort函数的基础入门使用教程”的完整攻略及两条示例说明。 C++中sort函数的基础入门使用教程 简介 sort函数是C++ STL中的一个快速排序函数,我们可以用它对数组或容器进行排序。 基本使用 sort函数的一般形式如下: #include <algorithm> sort(first, last, cmp); 其…

    算法与数据结构 2023年5月19日
    00
  • 使用C语言求解扑克牌的顺子及n个骰子的点数问题

    “使用C语言求解扑克牌的顺子及n个骰子的点数问题”,我们可以分别来看一下。 1. 求解扑克牌的顺子 首先我们需要了解什么是扑克牌的顺子,即五张连续的牌,如”10 J Q K A”等。因为一副牌里,最小的牌为2,最大的牌为A(即1),所以任何5张牌中最大和最小的差值不能超过4。 我们可以先将5张牌进行排序,然后用最大牌和最小牌计算差值,再去除所有大小王,如果差…

    算法与数据结构 2023年5月19日
    00
  • Trie树_字典树(字符串排序)简介及实现

    接下来我将详细讲解“Trie树_字典树(字符串排序)简介及实现”的完整攻略。 什么是 Trie 树? Trie 树,也叫字典树,是一种树形数据结构,用于处理字符串匹配、排序等问题。它的特点是能够快速地查找特定前缀或后缀的字符串。 Trie 树的基本实现 Trie 树通常是一棵多叉树,其中根节点不包含任何字符,每个子节点包含一个字符,组成一个完整的字符串。下面…

    算法与数据结构 2023年5月19日
    00
  • C语言排序算法之选择排序(直接选择排序,堆排序)

    C语言排序算法之选择排序 选择排序概述 选择排序是一种简单直观的排序算法,其基本思想是:每一趟从数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列最后,直到全部数据元素排完为止。 选择排序算法的时间复杂度为O(n^2),在数据规模较小时效率较高,但是在数据规模较大时效率较低。 选择排序示例 以下是一个使用选择排序算法对数组进行排序的示例: #in…

    算法与数据结构 2023年5月19日
    00
  • C语言实现快速排序算法实例

    下面是“C语言实现快速排序算法实例”的完整攻略: 快速排序算法简介 快速排序是一种高效的排序算法,属于比较排序中的一种,采用分治策略,通过将原序列划分为若干个子序列依次排序,最终得到有序序列。该算法的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2),因此在实际应用中要根据数据规模和数据分布情况选择合适的算法。 C语言快速排序实现示例 下…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法之快速排序(Quick Sort)及其优化算法详解

    PHP排序算法之快速排序(Quick Sort)及其优化算法详解 快速排序是一种高效的排序算法,也是PHP中常用的排序方法之一。在本攻略中,我们将介绍快速排序的基本思想与原理,以及一些优化算法和实际示例。 快速排序基本原理 快速排序的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部…

    算法与数据结构 2023年5月19日
    00
  • C#实现的二维数组排序算法示例

    接下来我将为大家详细讲解“C#实现的二维数组排序算法示例”的完整攻略。 什么是二维数组排序算法? 二维数组是一种常见的数据结构,是一个表格状(行列)的数组。而排序算法则是把一组无序的数据按照规定的排序方式进行排列的算法。二维数组排序算法是在二维数组基础上进行排序操作的算法。 C#实现二维数组排序算法示例 下面我们来看看如何用C#实现二维数组排序算法的示例: …

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