c++归并排序详解

C++归并排序详解

归并排序是一种基于分治思想的高效排序算法,它的时间复杂度为O(nlogn),并且它的稳定性使得它在实际应用中得到了广泛的应用。在本文中,我们将为大家详细讲解C++归并排序的具体实现过程和算法思想。

算法原理

归并排序基于分治算法,首先将待排序序列不断二分,直到每个子序列只剩一个元素,然后将相邻的子序列进行归并,合并后的子序列再次进行归并,最终得到有序序列。

简单来说,归并排序可以概括为以下三个步骤:

  1. 分割:将待排序序列不断二分,直到每个子序列只剩一个元素。
  2. 归并:将相邻的子序列进行归并,合并后的子序列再次进行归并。
  3. 合并:最终得到有序的序列。

代码实现

下面是C++中归并排序的具体实现:

void merge(vector<int>& nums, int start, int mid, int end) {
    int left = start, 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++]);
    for (int i = 0; i < temp.size(); ++i) 
        nums[start + i] = temp[i];
}

void mergeSort(vector<int>& nums, int start, int end) {
    if (start >= end) return;
    int mid = (start + end) / 2;
    mergeSort(nums, start, mid);
    mergeSort(nums, mid + 1, end);
    merge(nums, start, mid, end);
}

归并排序的主要部分是归并操作,也就是merge函数。mergeSort函数用于划分子序列和递归调用归并操作,其中start表示待排序序列的起始位置,end表示终止位置,mid表示中间位置。在merge函数中,定义temp用于临时存储归并后的结果,在循环中依次将两个子序列的元素进行比较,将较小的元素依次存入temp中,最终将剩余的元素直接插入到temp中,然后将temp中的元素拷贝回原数组中。

示例说明

示例一

看下面这个例子,假设我们有一个数组[6,8,4,3,9,1,7,2,5]需要进行排序。

  1. 分割:首先整个数组被分为[6,8,4,3][9,1,7,2,5]两个子序列,然后两个子序列再分别被分割为[6,8][4,3][9,1,7][2,5]两个子序列,最终分为[6][8][4][3][9][1][7][2][5]这九个独立的子序列。
  2. 归并:将相邻子序列归并,首先将[6][8]两个子序列进行合并,得到[6,8],继续将[3][4]进行合并,得到[3,4],然后将[6,8][3,4]进行合并,得到[3,4,6,8]。同理,将另一个半部分归并,得到[1,2,5,7,9]
  3. 合并:最终将[3,4,6,8][1,2,5,7,9]进行合并,得到[1,2,3,4,5,6,7,8,9]

示例二

假设我们有一个长度为1000的随机数组,需要进行排序并统计时间复杂度。

#include <iostream>
#include <vector>

using namespace std;

void merge(vector<int>& nums, int start, int mid, int end) {
    int left = start, 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++]);
    for (int i = 0; i < temp.size(); ++i) 
        nums[start + i] = temp[i];
}

void mergeSort(vector<int>& nums, int start, int end) {
    if (start >= end) return;
    int mid = (start + end) / 2;
    mergeSort(nums, start, mid);
    mergeSort(nums, mid + 1, end);
    merge(nums, start, mid, end);
}

int main() {
    vector<int> nums;
    for (int i = 0; i < 1000; ++i)
        nums.push_back(rand() % 1000);
    mergeSort(nums, 0, nums.size() - 1);
    for (int num : nums)
        cout << num << " ";
    return 0;
}

在示例二中,我们生成了一个长度为1000的随机数组,使用归并排序进行排序,并统计时间复杂度。通过测试数据发现,对于长度为1000的序列,归并排序的时间复杂度在0.5ms左右。

总结

本文详细讲解了C++归并排序算法的基本原理、代码实现和示例。归并排序划分自序列、递归和合并操作使得它的时间复杂度为O(nlogn),并且稳定性在实际应用中得到了广泛的应用。

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

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

相关文章

  • PHP常用的排序和查找算法

    PHP常用的排序和查找算法 排序算法 冒泡排序 冒泡排序是一种简单的排序算法。 它多次遍历要排序的列表,每次比较相邻的两项,如果它们的顺序错误就把它们交换过来。 示例代码如下: function bubble_sort($arr) { $len = count($arr); for($i=1; $i<$len; $i++) { for($j=0; $j…

    算法与数据结构 2023年5月19日
    00
  • C++ sort排序之降序、升序使用总结

    C++ sort排序之降序、升序使用总结 介绍 sort函数是C++ STL库提供的一种排序函数,可以快速方便地对数组或容器进行排序。本文将详细介绍sort函数的用法,包括排序方式、自定义比较函数和对容器的排序等内容。 基本用法 sort函数的声明如下: template <class RandomAccessIterator> void sor…

    算法与数据结构 2023年5月19日
    00
  • JS中的算法与数据结构之字典(Dictionary)实例详解

    下面我将详细讲解“JS中的算法与数据结构之字典(Dictionary)实例详解”的完整攻略。 什么是字典? 字典是一种存储唯一键和对应值的数据结构,每个键对应一个值。JavaScript 中的对象就是字典的一种实现,通过键值对来存储和访问数据。 字典的操作 字典支持以下几种操作: 添加键值对 删除键值对 查找键值对 获取所有键 获取所有值 字典的实现 下面是…

    算法与数据结构 2023年5月19日
    00
  • Python利用treap实现双索引的方法

    Python利用treap实现双索引的方法 本文将介绍如何用Python语言实现基于treap的双索引方法来建立文本检索系统。 什么是treap? treap是一种二叉搜索树和堆(heap)的混合体。在treap中,每个节点包含一个键值和一个随机权重值。treap强制节点按照二叉搜索树的顺序排列,同时也保持堆的性质,即每个节点的权重都会小于其子节点的权重。这…

    算法与数据结构 2023年5月19日
    00
  • java如何给对象按照字符串属性进行排序

    在 Java 中,我们可以使用 Collections.sort() 方法对任意类型的对象进行排序。但是,如果我们想要按照对象的某一个字符串属性进行排序,我们可以使用 Comparator 接口来实现。 具体步骤如下: 首先,创建一个 Comparator 对象,重写 compare() 方法,按照需要的属性进行排序。例如,如果我们要按照对象的 name 属…

    算法与数据结构 2023年5月19日
    00
  • c++插入排序详解

    c++插入排序详解 1. 插入排序算法介绍 插入排序法是一种简单直观的排序方法。它的基本思路是通过每次将一个待排序的元素按照其大小插入到已经排好序的一组元素中,直到全部元素插入完毕,即排序完毕。 在实际应用中,对于较小的数据集,插入排序通常比快速排序和归并排序等复杂度为O(nlogn)的算法执行效率更高。 2. 插入排序算法的实现 下面给出一个C++实现的插…

    算法与数据结构 2023年5月19日
    00
  • PHP 数组排序方法总结 推荐收藏

    PHP 数组排序方法总结 推荐收藏 1. 为什么要学习数组排序 PHP 数组内置的排序函数,能够对数组的元素进行排序,满足不同场景下的需求。理解如何使用数组排序函数能够提高开发效率,并且能够帮助开发者写出更加高效、优雅的代码。 2. PHP 数组排序函数总结 PHP 数组的排序方法主要有以下几种: 2.1 sort() 对数组进行升序排列。 2.1.1 排序…

    算法与数据结构 2023年5月19日
    00
  • C++使用一个栈实现另一个栈的排序算法示例

    C++使用一个栈实现另一个栈的排序算法 本文将介绍如何使用一个栈(以下称为stack1)将另一个未排序的栈(以下称为stack2)进行排序,排序结果存放在stack2中。 实现思路 我们可以通过stack1不断从stack2中弹出元素,将弹出的元素插入到正确的位置,实现栈的排序。 具体步骤如下: 创建一个临时变量temp,用于存储stack1中弹出的元素。 …

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