C++实现归并排序

yizhihongxing

C++实现归并排序

什么是归并排序

归并排序是一种分治策略的排序算法,将待排序的序列切分为若干个子序列,递归地对子序列排序,并将各子序列的排序结果合并成最终有序序列。归并排序的时间复杂度为O(nlogn),是一种高效的排序算法。

归并排序的实现

递归实现

归并排序的递归实现比较容易理解。我们可以将待排序的序列不断切分为更小的子序列,直到子序列长度为1,此时子序列已经是有序的,然后将有序的子序列合并成更大的有序序列。

下面是C++实现的递归方法:

void merge_sort(int arr[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        merge_sort(arr, left, mid);
        merge_sort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

在该方法中,参数arr是要排序的数组,参数left表示要排序的子数组的左边界,参数right表示要排序的子数组的右边界。方法中首先判断子数组的长度是否大于1,如果是,则继续将子数组划分为更小的子数组并递归调用归并排序方法。最后调用合并方法merge将排好序的子数组合并成更大的有序序列。

合并实现

为了将两个子数组合并成一个有序数组,我们需要一个辅助数组,并定义三个指针ijk,分别指向两个待合并的子数组的起始位置和辅助数组的起始位置。将两个子数组的元素依次比较,将最小的元素放入辅助数组中,直到其中一个子数组的元素全部比较完毕。此时再将另一个子数组的剩余元素依次放入辅助数组中。最后将辅助数组中的元素复制回原数组中。

下面是C++实现的合并方法:

void merge(int arr[], int left, int mid, int right) {
    int i = left, j = mid + 1, k = 0;
    int tmp[right - left + 1];
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            tmp[k++] = arr[i++];
        } else {
            tmp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        tmp[k++] = arr[i++];
    }
    while (j <= right) {
        tmp[k++] = arr[j++];
    }
    for (int p = 0; p < k; p++) {
        arr[left + p] = tmp[p];
    }
}

在该方法中,参数arr是要排序的数组,参数left表示子数组的左边界,参数mid表示子数组的中间位置,参数right表示子数组的右边界。方法中定义了一个辅助数组tmp,并用指针ijk分别指向子数组和辅助数组。然后比较子数组的元素大小,较小的元素放入辅助数组中,对应的指针向后移动。最后将辅助数组中的元素复制回原数组中。

示例说明

假设要对序列{8, 3, 2, 9, 7, 1, 5, 4}进行归并排序。

第一步

首先将整个序列切分为两个子序列{8, 3, 2, 9}和{7, 1, 5, 4}。

第二步

对子序列{8, 3, 2, 9}继续切分,分别得到{8, 3}和{2, 9}两个子序列。对子序列{7, 1, 5, 4}同样进行切分,得到{7, 1}和{5, 4}两个子序列。

第三步

继续对子序列进行切分,得到8、3、2、9、7、1、5、4等八个有序子序列。

第四步

将两两相邻的有序子序列合并,得到{3, 8}、{2, 9}、{1, 7}、{4, 5}四个有序数组。

第五步

继续将两两相邻的有序数组合并,得到{2, 3, 8, 9}和{1, 4, 5, 7}两个有序数组。

第六步

最后将两个有序数组合并,得到{1, 2, 3, 4, 5, 7, 8, 9},即为最终排序结果。

代码演示

以下是完整的C++代码:

#include <iostream>

using namespace std;

void merge(int arr[], int left, int mid, int right) {
    int i = left, j = mid + 1, k = 0;
    int tmp[right - left + 1];
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            tmp[k++] = arr[i++];
        } else {
            tmp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        tmp[k++] = arr[i++];
    }
    while (j <= right) {
        tmp[k++] = arr[j++];
    }
    for (int p = 0; p < k; p++) {
        arr[left + p] = tmp[p];
    }
}

void merge_sort(int arr[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        merge_sort(arr, left, mid);
        merge_sort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

int main() {
    int arr[] = {8, 3, 2, 9, 7, 1, 5, 4};
    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;
}

运行结果为:1 2 3 4 5 7 8 9,即为排序结果。

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

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

相关文章

  • C#实现快速排序算法

    下面是C#实现快速排序算法的完整攻略: 快速排序算法简介 快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn)。快速排序算法的基本思想是,通过一趟排序将待排序列分隔成独立的两部分,其中一部分的所有数据都比另外一部分小,然后再对这两部分继续进行排序,以达到整个序列有序的目的。 快速排序算法实现步骤 快速排序算法的实现步骤如下: 选择一个中间值,将…

    算法与数据结构 2023年5月19日
    00
  • Java实现快速排序和堆排序的示例代码

    Java实现快速排序和堆排序是经常被面试官提问的面试题目之一。下面是一份攻略,来帮助大家快速掌握这两种排序算法。 快速排序 快速排序(Quick Sort)是一种基于分治思想实现的排序算法,其主要思路是通过分区(Partition)操作将一个数组分成两个子数组,再分别对子数组进行排序,从而达到整个数组有序的目的。 以下是Java实现快速排序的示例代码: pu…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数据结构与算法之二叉树添加/删除节点操作示例

    首先让我们来介绍一下“JavaScript数据结构与算法之二叉树添加/删除节点操作示例”这个主题。 主题介绍 本主题主要介绍了在 JavaScript 中对于二叉树数据结构进行添加/删除节点操作的示例代码。二叉树是一种常见的树形结构,在计算机科学领域中被广泛应用。节点的添加与删除是该数据结构中常见的操作之一,本主题将通过示例代码,为您详细介绍操作的过程。 代…

    算法与数据结构 2023年5月19日
    00
  • Swift中排序算法的简单取舍详解

    Swift中排序算法的简单取舍详解 排序算法在编程中是非常常见的算法之一,从小到大或者从大到小排列一串数字列表,这是必不可少的需求。在Swift编程语言中,也提供了多种排序算法供我们使用。但是,不同的排序算法在排序过程中的时间复杂度和空间复杂度往往是不同的。因此,在实际的编程中,我们需要根据实际情况来选择合适的排序算法。本文将为大家详细讲解Swift中四种常…

    算法与数据结构 2023年5月19日
    00
  • C语言完整实现12种排序算法(小结)

    C语言完整实现12种排序算法(小结) 本文主要介绍了C语言实现12种排序算法的详细过程以及相关示例。 排序算法的分类 排序算法可分为内部排序和外部排序。内部排序是指将待排序的数据全部加载到内存中进行排序,而外部排序是指在数据量过大时需要将数据分块,对每一块数据进行排序,最后将各个块合并起来,得到有序的结果。 在内部排序中,常用的排序算法大致可分为以下几类: …

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

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

    算法与数据结构 2023年5月19日
    00
  • C/C++实现三路快速排序算法原理

    C/C++实现三路快速排序算法原理 算法概述 三路快速排序算法是一种优化版本的快速排序算法,能够处理含有大量重复元素的数组,避免了快速排序中大量递归处理相等元素的繁琐工作。 三路快速排序的原理是采用三个指针将数组分成小于、等于和大于三个部分,递归地向下快速排序,最终将整个数组排序。 实现步骤 首先选取数组中的一个元素作为标志物,通常是数组的第一个元素。 定义…

    算法与数据结构 2023年5月19日
    00
  • C语言简明讲解快速排序的应用

    C语言简明讲解快速排序的应用 快速排序的概述 快速排序是一种基于比较的排序算法,最初由Tony Hoare于1959年发明,因其在实践中的高效性而受到广泛的应用。快速排序的基本思想是通过不断地分割(partition)和交换(swap)来实现排序,具体来说,就是先选取一个pivot数,然后将序列中小于pivot的数放在pivot左边,大于pivot的数放在p…

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