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

yizhihongxing

下面是“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++数组排序的5种方法实例代码

    C++ 数组排序的 5 种方法实例代码 本篇文章介绍了使用 C++ 实现数组排序的 5 种方法,包括冒泡排序、选择排序、插入排序、希尔排序和快速排序。下面我们就分别详细阐述各种排序方法的实现。 冒泡排序 冒泡排序的基本思想是比较相邻的两个元素,如果顺序错误就交换位置。我们重复地执行这个过程,直到排序完成。示例代码如下: void BubbleSort(int…

    算法与数据结构 2023年5月19日
    00
  • C#七大经典排序算法系列(下)

    《C#七大经典排序算法系列(下)》是一篇文章,通过介绍七种经典的排序算法,帮助读者更好地理解排序算法的原理和操作,并且让读者掌握这些算法的基本实现方法。本文将会细致地讲解每种算法的思路、时间复杂度以及使用场景,希望读者能在阅读后掌握七种排序算法的差异和选用方法。 文章包含七种排序算法,分别为:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序和希尔排序…

    算法与数据结构 2023年5月19日
    00
  • Java 堆排序实例(大顶堆、小顶堆)

    下面我将为您介绍 Java 堆排序实例(大顶堆、小顶堆)的完整攻略。 1. 堆排序介绍 堆排序是一种树形选择排序方法,它的特点是将数组看成一棵完全二叉树,然后通过建立堆(一种特殊的完全二叉树),逐个取出堆顶元素并重新建堆的过程来进行排序。具体来说,堆排序可以分为两种:大顶堆排序和小顶堆排序。 在大顶堆排序中,堆顶元素最大,从小到大进行排序;在小顶堆排序中,堆…

    算法与数据结构 2023年5月19日
    00
  • Java 直接插入排序的三种实现

    Java 直接插入排序的三种实现 本文将介绍 Java 中直接插入排序的三种实现方式,分别为插入排序、希尔排序和折半插入排序。 插入排序 插入排序是一种简单直观的排序算法,其基本思想是将一个待排序的元素插入到已排好序列中的适当位置。 以下是 Java 中插入排序的实现代码: public static void insertSort(int[] arr) {…

    算法与数据结构 2023年5月19日
    00
  • PHP常见数组排序方法小结

    PHP常见数组排序方法小结 PHP的数组是一种非常有用的数据结构。当我们需要对数组进行排序时,PHP提供了许多常见的排序方法,包括冒泡排序、选择排序、插入排序、快速排序等,本文将对这些排序方法进行简要介绍和示例说明。 冒泡排序 冒泡排序是一种常见的排序方法,它的基本思想是:对相邻的元素进行比较,如果顺序不正确就交换。这个过程会持续到整个数组都有序为止。 fu…

    算法与数据结构 2023年5月19日
    00
  • C语言快速排序函数用法(qsort)

    C语言快速排序函数用法(qsort) 简介 快速排序是一种常见的排序算法,而C语言中的qsort函数则是一种快速排序的实现。使用qsort函数,我们无需自己编写快速排序算法的代码,只需要提供一个排序所需的比较函数即可。使用qsort函数,既可以方便的排序数组,还可以排序链表等数据结构。 函数原型 void qsort(void *base, size_t n…

    算法与数据结构 2023年5月19日
    00
  • 数组Array的排序sort方法

    下面是关于JavaScript中数组排序sort()方法的详细攻略。 标准语法 array.sort(compareFunction) 参数 compareFunction是可选的,是用来指定按照什么顺序进行排序的,具体取决于具体实现。 如果省略,sort() 方法按照每个字符的 Unicode 代码点进行排序,因此 “10” 在排列时会在 “2” 之前,此…

    算法与数据结构 2023年5月19日
    00
  • 基于Go语言实现插入排序算法及优化

    基于Go语言实现插入排序算法及优化攻略 插入排序算法 插入排序是一种简单直观的排序方法,主要思路是将未排序部分的第一个元素插入到已排序部分合适的位置。具体实现方式如下: func InsertionSort(arr []int) { n := len(arr) for i := 1; i < n; i++ { // 寻找arr[i]合适的插入位置 fo…

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