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日

相关文章

  • JS中多层次排序算法的实现代码

    让我为你介绍一份JS中多层次排序算法的实现代码攻略。 简介 多层次排序是指一个列表需要依据不同的规则进行排序,例如按照价格、销量、评分等进行排序。在JS中,我们可以通过自定义排序函数实现多层次排序。 实现 以下是实现多层次排序的示例代码: const products = [ { name: ‘iPhone 11’, price: 799, sales: 1…

    算法与数据结构 2023年5月19日
    00
  • Java算法之重新排列数组例题

    下面是我对“Java算法之重新排列数组例题”的完整攻略: 题目描述 对于一个给定的整数数组,让其中的偶数放在奇数之前,保持它们原有的相对顺序不变。例如,对于数组[1,2,3,4],需要修改为[1,3,2,4]。 思路分析 对于这个问题,我们可以利用双指针的思路解决。定义两个指针left和right,分别指向数组的头部和尾部。当left指向的数为偶数并且它在r…

    算法与数据结构 2023年5月19日
    00
  • PHP抽奖算法程序代码分享

    关于“PHP抽奖算法程序代码分享”的完整攻略,我将会从以下方面进行讲解: 什么是抽奖算法? 如何设计抽奖算法? 实现代码分享及示例说明 什么是抽奖算法? 抽奖算法是指通过一定的算法,实现在一些参与者中选出一个或几个”幸运儿”的过程。 如何设计抽奖算法? 抽奖算法设计的主要目的就是为了确保公平,同时符合某些要求。在比较公平的情况下,抽奖过程也应该是越来越具备娱…

    算法与数据结构 2023年5月19日
    00
  • C#实现冒泡排序和插入排序算法

    C#实现冒泡排序和插入排序算法 冒泡排序算法 冒泡排序算法是一种基本的排序算法,其基本思想是通过对相邻的元素进行比较和交换,逐渐把待排序的元素交换到相应的位置上。 在C#中,实现冒泡排序非常简单,代码示例如下: public static void BubbleSort(int[] arr) { int len = arr.Length; for (int …

    算法与数据结构 2023年5月19日
    00
  • JS实现的合并两个有序链表算法示例

    下面为您详细讲解JS实现的合并两个有序链表算法示例的完整攻略。 什么是合并两个有序链表? 合并两个有序链表,顾名思义就是将两个有序链表合并成一个有序链表。具体实现过程是将链表A和链表B按照顺序依次比较,将较小的节点插入到一个新的链表C中,直至A、B中有一个链表被遍历结束,另一个链表中剩余的节点则直接插入到链表C的最后。 示例如下: 链表A 链表B 合并后的链…

    算法与数据结构 2023年5月19日
    00
  • Python实现选择排序

    当我们需要对一个列表或数组进行排序时,选择排序是一种简单易懂的方法。Python是一种非常流行的编程语言,它可以轻松实现选择排序。 以下是Python实现选择排序的攻略: 选择排序的原理 选择排序是一种简单直观的排序算法,其基本思想是每次选择出最小的元素,放到已经排好序的部分的末尾。 实现步骤 找到未排序部分的最小元素; 将其放在已排序部分的末尾; 重复步骤…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现快速排序(自已编写)

    下面是详细的讲解JavaScript实现快速排序的完整攻略。 1. 什么是快速排序? 快速排序是一种常用的排序算法,通过分割(partition)和递归分治的思想来快速排序一个数组,在平均情况下它的时间复杂度为 $O(n\log n)$,也是一种不稳定的排序方法。 2. 快速排序的实现过程 2.1 分割 对一个数组进行快速排序的过程就是先将其从中间分割成两部…

    算法与数据结构 2023年5月19日
    00
  • php自定义二维数组排序函数array_orderby用法示例

    首先,让我们了解一下什么是“数组排序函数”以及“自定义排序函数”。 数组排序函数是指一些用来对数组排序的函数,例如sort()和asort()。自定义排序函数则是指我们可以根据自己的需求来编写一个排序函数,然后通过函数名传递给排序函数,让它按照我们自己的规则进行排序。 在PHP中,有一个函数array_orderby()可以帮助我们实现自定义排序功能。以下是…

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