C++实现归并排序

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++实现三路快速排序算法原理

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

    算法与数据结构 2023年5月19日
    00
  • 用C语言实现二分查找算法

    当实现查找某个元素时,一个常见的算法是二分查找(Binary Search),也称作折半查找。二分查找是一种在有序数组中查找某一特定元素的搜索算法,将目标值与数组的中间元素进行比较,如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。重复以上步骤,直到找到目标值或者确定目标值不存在。 以下是在C语言中实现二分查找的完整…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中几种排序算法的简单实现

    JavaScript中几种排序算法的简单实现 排序算法在计算机科学中是一个基本问题。不同的排序算法具有不同的时间和空间复杂度,选择合适的排序算法可以提高程序的效率。本文介绍了JavaScript中几种排序算法的简单实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。 冒泡排序 冒泡排序是最简单的排序算法之一。它重复遍历列表,比较相邻的元素,并交换它们…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

    算法与数据结构 2023年5月19日
    00
  • C语言手把手教你实现贪吃蛇AI(中)

    来看看如何实现贪吃蛇AI。首先,我们需要明确几个概念: 贪吃蛇:一个二维平面上移动的形如蛇的游戏角色。 AI:人工智能,指让计算机模拟人的智能行为。 贪吃蛇AI的实现需要完成以下步骤: 初始化游戏环境 实现蛇的移动 实现蛇的AI行为 检测游戏结束条件 接下来我们将一步步讲解如何实现这个过程。 1. 初始化游戏环境 在C语言中,我们需要使用 ncurses 库…

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

    C++实现快速排序(Quicksort)算法 快速排序(Quicksort)算法是一种常见的排序算法,具有快速、高效、稳定性好等特点,广泛应用于各种工程实践中。 快速排序的基本思想 快速排序的基本思想是:选取一个基准值(pivot),将待排序序列划分成左右两个子序列,左边的子序列中所有元素都不大于基准值,右边的子序列中所有元素都不小于基准值,然后对左右两个子…

    算法与数据结构 2023年5月19日
    00
  • C语言每日练习之选择排序

    C语言每日练习之选择排序 选择排序算法简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思路是在未排序的数列中,从前往后依次选择最小的数,和第一个数进行交换,然后在剩余的数列中从前往后选择最小的数,与第二个数进行交换,直到选择到最后一个数为止。 选择排序的时间复杂度为O(n²),属于较慢的排序算法,但是它的实现简单易懂,不需要额…

    算法与数据结构 2023年5月19日
    00
  • GO语言中常见的排序算法使用示例

    首先感谢你对“GO语言中常见的排序算法使用示例”的关注,下面是一个完整的攻略: GO语言中常见的排序算法 在GO语言中,常见的排序算法包括:冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序、堆排序等。这些排序算法的具体实现方式有所不同,但都可以在GO语言的标准库中找到相应的方法。 冒泡排序 冒泡排序的基本思路是比较相邻的两个元素,如果它们的顺序错误…

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