C++实现合并排序的方法

C++ 是一门功能强大的编程语言,提供了多种排序算法来满足不同场景的需要。其中,合并排序是一种常用的高效排序算法,下面我们就来介绍一下 C++ 实现合并排序的方法。

合并排序算法简介

合并排序算法是一种基于归并操作的排序算法,它的基本思想是将一个数组划分为两个子数组,递归地对这两个子数组分别进行排序,然后将排好序的两个子数组合并成一个有序的数组。该算法的时间复杂度为 O(nlogn),是一种高效的排序算法。

C++ 实现合并排序的方法

下面是 C++ 实现合并排序的一般步骤:

  1. 将待排序数组划分为两个子数组,分别排序;
  2. 将排好序的两个子数组合并成一个有序的数组。

下面给出这些步骤的详细代码实现:

// 合并排序函数
void merge_sort(vector<int>& nums, int begin, int end)
{
    // 判断数组是否为空或只有一个元素
    if (begin >= end) 
        return;

    int mid = begin + (end - begin) / 2;   // 计算中间位置

    // 递归排序左右两部分
    merge_sort(nums, begin, mid);
    merge_sort(nums, mid + 1, end);

    // 合并两个有序数组
    int left = begin, right = mid + 1;
    vector<int> temp;
    while (left <= mid && right <= end) {
        if (nums[left] <= nums[right])
            temp.push_back(nums[left++]);
        else
            temp.push_back(nums[right++]);
    }
    while (left <= mid)
        temp.push_back(nums[left++]);
    while (right <= end)
        temp.push_back(nums[right++]);

    // 将 temp 数组中的元素复制回 nums 数组中
    for (int i = begin; i <= end; ++i)
        nums[i] = temp[i - begin];
}

示例

下面分别以数组 {3,1,5,7,2,4,9,6,8} 和 {9,8,7,6,5,4,3,2,1} 为例,演示一下合并排序的过程。

示例一

输入:{3,1,5,7,2,4,9,6,8}

输出:{1,2,3,4,5,6,7,8,9}

            {3,1,5,7,2,4,9,6,8}
            /                \
       {3,1,5,7}            {2,4,9,6,8}
       /       \              /       \
    {3,1}     {5,7}        {2,4,9}   {6,8}
    /    \    /    \       /     \   /   \
   {3}   {1} {5}   {7}    {2,4}  {9} {6} {8} 
    \     /    \    /      /   \       /   \
   {1,3}  {5,7} {2,4,9}  {6,8,9} {}    {}    {}
     \    /       \        /     \       \   /
   {1,3,5,7}    {2,4,6,8,9}       {8,9}  {6,8}
       \           /                |     |
        \         /                 |     |
         \       /                  |     |
          \     /                   |     |
           \{1,2,3,4,5,6,7,8,9}-----{}  {8,9,6}
                      /                \   /
                     /                  \ /
                  {6,8,9}               {9,8,7,6,5,4,3,2,1}

示例二

输入:{9,8,7,6,5,4,3,2,1}

输出:{1,2,3,4,5,6,7,8,9}

            {9,8,7,6,5,4,3,2,1}
            /                \
           {9,8,7,6}        {5,4,3,2,1}
          /       \          /       \
         {9,8}   {7,6}     {5,4}    {3,2,1}
        /    \   /    \     /   \      /  \
       {9}   {8} {7}   {6} {5}  {4}   {3} {2,1}
        \     /    \    /      \      /    \
       {8,9} {6,7} {4,5} {2,3}  {1}   {1,2} {3}
         \    /      \      /   \   /            \
        {6,7,8,9}   {2,3,4,5}  {1}  {1,2,3}      {1,2,3}
          \             /       \        \         |
           \           /         {1,2,3,4,5,6,7,8,9}   |
            \{1,2,3,4,5,6,7,8,9}                      |
                                      /                \
                                     /                  \
                                  {6,7,8,9}            {1,2,3,4,5}
                                     |                  |
                                     |                  |
                                  {1,2,3,4,5,6,7,8,9}-----{1,2,3,4,5,6,7,8,9}

由上面两个示例可以看出,合并排序可以对任意长度的数组进行排序,其时间复杂度为 O(nlogn) ,这使得它成为了一个非常优秀的排序算法。

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

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

相关文章

  • JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】

    JavaScript数据结构与算法之基本排序算法定义与效率比较 概述 排序是计算机科学中最常见的操作之一,是将数据按照一定的顺序重新排列的过程。排序算法被广泛应用于搜索、数据压缩、数据库等领域。JavaScript中常用的基本排序算法有3种:冒泡排序、选择排序和插入排序。本文将详细介绍这三种算法的原理、JavaScript实现以及时间复杂度比较。 冒泡排序 …

    算法与数据结构 2023年5月19日
    00
  • c语言快速排序算法示例代码分享

    首先,我们需要了解什么是快速排序。快速排序(QuickSort)是一种排序算法,其采用了分治的思想,并使用递归的方式处理数据集合。它的基本思想是从待排序的数据集合中选择一个元素作为分界点(一般称为pivot),然后将小于pivot的元素放到pivot左边,大于pivot的元素放到pivot右边,最后将pivot放到中间位置。然后递归处理pivot左右两边的子…

    算法与数据结构 2023年5月19日
    00
  • C++实现堆排序示例

    下面就详细讲解一下“C++实现堆排序示例”的完整攻略。 什么是堆排序 堆排序是一种树形选择排序方法,它是通过将待排序的序列构建成一个堆,在堆中,全局最大或最小的元素总是位于根节点,根节点最大或最小的元素会被输出到一个新的序列中,再将剩余的元素重新构建成堆进行下一轮循环,直到所有元素均被输出为止。 实现步骤 堆排序主要有两个步骤:构建堆和调整堆。 构建堆 将待…

    算法与数据结构 2023年5月19日
    00
  • 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语言实现交换排序算法(冒泡,快速排序)的示例代码

    C语言实现交换排序算法(冒泡排序、快速排序)通常分为以下步骤: 分析算法:首先,我们需要对选定的排序算法进行仔细的分析,了解排序过程中的基本操作、时间复杂度和空间复杂度等基本信息。 编写函数:依照分析结果,编写函数实现排序算法。同时,考虑如何优化代码以提高排序效率。 测试函数:编写测试代码对排序函数进行测试,检查是否正确。 以下是两个示例说明: 冒泡排序 冒…

    算法与数据结构 2023年5月19日
    00
  • Java语言字典序排序算法解析及代码示例

    Java语言字典序排序算法解析及代码示例 概述 字典序排序是一种常见的字符串排序算法,其可用于字符串编程中的许多场景,例如:搜索引擎中输入提示的联想;电商网站的商品搜索结果排列;信息化项目中的数据对比等。 本文将介绍Java语言中使用字典序排序的方法以及实现代码,并包含两个代码示例以帮助读者更好地理解。 基本思想 字典序排序的基本思想是将需要排序的字符串按照…

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言排序方法(冒泡,选择,插入,归并,快速)

    下面是关于C语言排序方法冒泡、选择、插入、归并、快速的详细攻略: 冒泡排序 冒泡排序是一种最简单的排序算法,它的核心思想是从左到右依次比较相邻的两个元素,如果前一个元素大于后一个元素,就交换它们的位置,这样一遍比较后,最大的元素就会被“冒泡”到最右边。然后再对剩余的元素重复同样的操作,这样一直迭代直到整个序列排序完成。 下面是标准的C语言冒泡排序代码示例: …

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