首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于CLRS的归并排序算法介绍,带倒置计数,基于C++

归并排序是一种经典的排序算法,它基于分治策略将一个大问题分解为多个小问题,然后将小问题的解合并起来得到最终的解。该算法的核心思想是将待排序的数组不断地二分,直到每个子数组只有一个元素,然后再将这些子数组两两合并,直到最终得到有序的数组。

归并排序的步骤如下:

  1. 将待排序的数组递归地二分为两个子数组,直到每个子数组只有一个元素。
  2. 对每个子数组进行合并操作,将两个有序的子数组合并为一个有序的数组。
  3. 重复步骤2,直到最终得到完全有序的数组。

归并排序的倒置计数是指在排序过程中统计数组中的倒置对数,即数组中的逆序对数量。倒置对是指在数组中,如果i < j 且 A[i] > A[j],则称(A[i], A[j])为一个倒置对。倒置计数可以用于衡量数组的有序程度。

C++实现归并排序的代码如下:

代码语言:txt
复制
#include <iostream>
#include <vector>

using namespace std;

// 合并两个有序数组
void merge(vector<int>& nums, int left, int mid, int right, int& count) {
    vector<int> temp(right - left + 1);
    int i = left, j = mid + 1, k = 0;

    while (i <= mid && j <= right) {
        if (nums[i] <= nums[j]) {
            temp[k++] = nums[i++];
        } else {
            temp[k++] = nums[j++];
            count += mid - i + 1;  // 统计倒置对数
        }
    }

    while (i <= mid) {
        temp[k++] = nums[i++];
    }

    while (j <= right) {
        temp[k++] = nums[j++];
    }

    for (int p = 0; p < temp.size(); p++) {
        nums[left + p] = temp[p];
    }
}

// 归并排序
void mergeSort(vector<int>& nums, int left, int right, int& count) {
    if (left >= right) {
        return;
    }

    int mid = left + (right - left) / 2;
    mergeSort(nums, left, mid, count);
    mergeSort(nums, mid + 1, right, count);
    merge(nums, left, mid, right, count);
}

// 归并排序入口函数
vector<int> mergeSort(vector<int>& nums) {
    int count = 0;
    mergeSort(nums, 0, nums.size() - 1, count);
    return nums;
}

int main() {
    vector<int> nums = {5, 2, 6, 1, 3, 4};
    vector<int> sortedNums = mergeSort(nums);

    cout << "排序结果:";
    for (int num : sortedNums) {
        cout << num << " ";
    }
    cout << endl;

    cout << "倒置对数:" << count << endl;

    return 0;
}

归并排序的时间复杂度为O(nlogn),其中n为待排序数组的长度。它是一种稳定的排序算法,适用于各种规模的数组排序。

归并排序的应用场景包括但不限于:

  • 大规模数据的排序:归并排序适用于需要对大规模数据进行排序的场景,因为它的时间复杂度较低且稳定。
  • 外部排序:归并排序可以应用于外部排序,即数据量太大无法一次性加载到内存中进行排序的情况。
  • 并行计算:归并排序可以通过并行计算的方式提高排序的效率,适用于分布式计算环境。

腾讯云提供的相关产品和服务包括:

  • 云服务器CVM:提供弹性计算能力,可用于部署和运行归并排序算法。
  • 云数据库CDB:提供高性能、可扩展的数据库服务,可用于存储和管理排序所需的数据。
  • 云原生容器服务TKE:提供容器化的部署和管理能力,可用于运行归并排序算法的容器实例。
  • 人工智能平台AI Lab:提供丰富的人工智能开发工具和服务,可用于在归并排序算法中应用人工智能相关技术。

更多关于腾讯云产品和服务的信息,请访问腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Algorithms Unlocked》读书笔记3——计数排序

《Algorithms Unlocked》是 《算法导论》合著者之一 Thomas H. Cormen 写一本算法基础,算是啃CLRS开胃菜和辅助教材。...如果CLRS厚度让人望而生畏,这本200多页小读本刚好合适带你入门。 书中没有涉及编程语言,直接用文字描述算法,我用 JavaScript 对书中算法进行描述。...超越下界 之前四个排序算法——选择排序、插入排序归并排序、快速排序都是依赖于对排序关键字进行比较。...假如我们还是依赖这一规则,无论是简单或复杂算法或者还没被发现算法都无法突破这一下界(最坏情况下所需要最小时间)。所以我们需要更改游戏规则,不让算法利用比较来进行排序。...反之,它将排序关键字作为数组索引,能进行这样操作是因为排序关键字均是非常小整数。如果排序关键字是带有分数实数,或者是字符串,那么我们就不能使用计数排序了。

55760

CC++ 计数排序

本文内容:C/C++ 计数排序 ---- C/C++ 计数排序 1.什么是计数排序 2.动图演示 3.C/C++代码实现 ---- 1.什么是计数排序 计数排序(Counting Sort)是一种非基于比较排序算法...,该算法于1954年由 Harold H....计数排序步骤如下: 找出待排序数组中最大和最小元素 统计数组中每个值为i元素出现次数,存入数组C第i项 对所有的计数累加(从C中第一个元素开始,每一项和前一项相加) 反向填充目标数组:...将每个元素i放在新数组第C[i]项,每放一个元素就将C[i]减去1 它优势在于在对一定范围内整数排序时,它复杂度为Ο(n + k)(其中k是整数范围),快于任何比较排序算法。...当然这是一种牺牲空间换取时间做法,而且当O(k)>O(n * log(n))时候其效率反而不如基于比较排序基于比较排序时间复杂度在理论上下限是O(n * log(n)), 如归并排序,堆排序

40910

排序、搜索、 动态规划,DeepMind用一个神经算法学习器给解决了

机器之心报道 机器之心编辑部 来自 DeepMind 等机构研究者提出了一个通用神经算法学习器,其能够学习解决包括排序、搜索、贪心算法、动态规划、图形算法等经典算法任务,达到专家模型平均水平。...事实上,可以进行神经推理架构需要算法对齐、自监督学习等其他算法辅助。更进一步讲,这些模型需要在基于观察基础上,对生成新知识有一定稳健性,特别是当这些知识脱离训练数据域时。...本文中, 来自 DeepMind 等机构研究者提出一个通用神经算法学习器:具有单一参数集 GNN,其能够同时学习解决经典算法任务,包括排序、搜索、贪心算法、动态规划、图形算法、字符串算法和几何算法,...研究介绍 研究者提出通用神经算法学习器如下图 1 所示。...论文第 3 章是主旨部分,主要介绍了表示、训练机制和架构改进,使得单个模型性能明显优于之前在 CLRS-30 上发布 SOTA 技术。

34330

Qtech 暑假未讲到算法(不完全)

一、数据结构: 优先队列、堆、RMQ问题(区间最值问题,可以用线段树解决,还有一个Sparse-Table算法)、排序二叉树、划分树、归并树........字符串处理: KMP、字典树、后缀树、后缀数组(两种求后缀数组方法 倍增和DC3算法) 包括C++ STL 里面一些东西 比如sort vector map set stack queue...还有快排、归并、堆、冒泡、选择、插入、希尔、基数、计数、地精等排序算法最好了解一下,还有基于快排区间第K值快速查找法 二、图论算法: 二分匹配、网络流、几种最短路径算法、差分约束、强or...四、数论&计算几何&博弈论 这个就涉及多了,包括各种数学定理、微积分、概率论、线性代数等等数学知识,有很多很难问题,不过一些基础数论还是要知道,比如gcd.......五、搜索 假期讲了dfs和bfs原理,它们应用很广,还有一些衍生出来算法,比如双向广搜、A-star搜索、跳点搜索。。。

33410

十大排序——最全最详细,一文让你彻底搞懂

Sort 堆排序 Heap Sort 归并排序 二路归并排序 Merge Sort 多路归并排序 Merge Sort 非比较排序 计数排序 Counting Sort 基数排序 Radix Sort...Top 归并排序 二路归并排序 Merge Sort 归并排序是建立在归并操作上一种有效排序算法。该算法是采用 分治法(Divide and Conquer) 一个非常典型应用。...动图演示 图示算法 代码实现 Python (首先使用Python原因在于:C++或者其他语言书写较为繁琐,归并排序思想使用Python语言就可以简洁明晰地表达。)...Top 非比较排序 计数排序 Counting Sort 计数排序不是基于比较排序算法,其核心在于将输入数据值转化为键存储在额外开辟数组空间中。...+排序算法计数排序 分析 计数排序是一个稳定排序算法

82621

Arrays.Sort()中那些排序算法

本文基于JDK 1.8.0_211撰写,基于java.util.Arrays.sort()方法浅谈目前Java所用到排序算法,仅个人见解和笔记,若有问题欢迎指证,着重介绍其中TimSort排序,其源于...引入 Arrays.Sort方法所用排序算法主要涉及以下三种:双轴快速排序(DualPivotQuicksort)、归并排序(MergeSort)、TimSort,也同时包含了一些非基于比较排序算法...; 当待排序数目大于29,采用计数排序(CountingSort) 非基于比较排序算法-计数排序 计数排序与传统基于比较排序算法不同,其不通过比较来排序。...我们常见基于比较排序算法有三种:桶排序计数排序(特殊桶排序)、基数排序,有兴趣可以逐个去了解,这里主要讲解计数排序。...9, 9, 9, 10 计数排序稳定性与最终实现 根据上面稳定性定义,大家不难发现上面的实现过程不能保证基数排序稳定性,而实际上计数排序是一个稳定排序算法,下面我们通过上面那个例子来引出计数排序最终实现

81120

理解桶排序算法原理

计数排序,基数排序,桶排序是所有排序算法里面时间复杂度能达到O(N)级别的算法,这主要原因是因为他们不采用基于比较算法,前面的文章已经介绍计数排序原理,本片文章我们来学习一下桶排序(Bucket...,这里排序算法不限,可以采用计数排序,快排,插入都可以。...,此时如果还采用了基于比较排序算法,那么最坏时间复杂度会达到O(n^2)。...我这里使用Java内置集合工具类来排顺序,这块排序算法不限制也可以采用计数排序,插入排序等。...最终在每一段排完顺序后依次合并即可,合并时候不需要做任何额外比较,这一点区别于归并排序。 ?

1.8K40

浅析:java排序函数使用了哪些算法

常用排序算法 我们简单罗列一下目前常用排序算法英文说明,以便后面阅读源码做参考: 冒泡排序 Bubble Sort 插入排序 Insertion Sort 归并排序 Merge Sort 快排..., 我们同样可以暂时得出一个结论: 当我们调用选择器Collections.sort()方法, 可能会执行两种算法 归并排序、TimSort, 但由于LegacyMergeSort.userRequested...2、否则就是 归并排序 所以兄弟们可以这样理解: TimSort是基于归并排序 + 插入排序优化算法!...以上是基于else分支得出结论,接下来我们继续探讨if分支逻辑: c == null -> sort(a) 这里逻辑也很清晰,两种情况: true: 归并排序 false(默认):ComparableTimSort...泛型排序分支比较多,我们再重新梳理一下逻辑: 01.Collections.sort(List list) legacyMergeSort 归并排序 TimSort (默认) 02.比较器Collections.sort

43810

小白学排序 | 十大经典排序算法(动图)

算法分类 冒泡排序(重点) 选择排序 插入排序 归并排序(重点) 快速排序(重点) 堆排序(重点) 计数排序 基数排序 本文重点排序方法在:冒泡排序归并排序,快速排序,桶排序。...非比较类排序:不通过比较来决定元素间相对次序,它可以突破基于比较排序时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 ? 【算法复杂度】 ?...归并排序(重点) Merge Sort 归并排序是建立在归并操作上一种有效排序算法。该算法是采用分治法(Divide and Conquer)一个非常典型应用。...有点类似比赛半决赛,四分之一决赛,八强这样感觉。 计数排序 Counting Sort 计数排序不是基于比较排序算法,其核心在于将输入数据值转化为键存储在额外开辟数组空间中。...计数排序不是基于比较,所以是线性时间复杂度,但是速度快代价就是对输入数据有限制要求:确定范围整数 【算法描述】 这部分不怎么用看,直接看动图就理解了 找出待排序数组中最大和最小元素; 统计数组中每个值为

68030

数据结构-概述

要求: (1)给出算法基本设计思想 (2)根据设计思想,采用C或C++或java语言描述算法,关键之处给出注释 (3)说明你所设计算法时间复杂度和空间复杂度 [2011年真题]2.一个长度为L(L>...直接插入排序适用于基本有序算法和数据量不大排序表,基于此提出了希尔排序,又称缩小增量排序。...假定待排序表含有n个记录,则可以看成是n个有序子表,然后不断两两归并直到合成一个长度为n有序表为止,这种排序方法称为2-路归并排序。 递归形式2-路归并排序算法基于分治额,对子表递归地排序。...7.7.3 多路平衡归并与败者树 上节提到,可以增加归并路数m来减少归并趟数S,进而减少访问外存次数。然而增加归并路数m又会增加算法内部排序时间。因此不能使用普通内部归并排序算法。...7.7.4 置换-选择排序(生成初始段) 如果采用前面介绍内部排序方法,将得到长度都相同初始归并段。因此,需要使用新算法那来生成初始归并段。

1.4K10

七大经典、常用排序算法原理、Java 实现以及算法分析

这个坑以排序为开端,介绍了 7 种最经典、最常用排序算法,分别是:冒泡排序、插入排序、选择排序归并排序、快速排序、桶排序计数排序、基数排序。...对应时间复杂度如下所示: 排序算法 时间复杂度 是否基于比较 冒泡、插入、选择 O(n^2) √ 快排、归并 O(nlogn) √ 桶、计数、基数 O(n) × 整篇文章主要知识提纲如图所示: ?...图中给出第 6 次了,但是第 6 次其实没必要。 ? img 2.1.1....优化 由于分区点很重要(为什么重要见算法分析),因此可以想方法寻找一个好分区点来使得被分区点分开两个分区中,数据数量差不多。下面介绍两种比较常见算法: **三数取中法。...桶排序计数排序、基数排序时间复杂度是线性,所以这类排序算法叫做线性排序。之所以这能做到线性排序,主要是因为这三种算法都不是基于比较排序算法,不涉及到元素之间比较操作。

69610

「干货总结」程序员必知必会十大排序算法

绪论 身为程序员,十大排序是是所有合格程序员所必备和掌握,并且热门算法比如快排、归并排序还可能问比较细致,对算法性能和复杂度掌握有要求。...对于排序分类,主要不同维度比如复杂度来分、内外部、比较非比较等维度来分类。我们正常讲十大排序算法是内部排序,我们更多将他们分为两大类:基于「比较和非比较」这个维度去分排序种类。...也有很多人将排序归纳为8大排序,那就是因为基数排序计数排序是建立在桶排序之上或者是一种特殊排序,但是基数排序计数排序有它特有的特征,所以在这里就将他们归纳为10种经典排序算法。...而比较类排序也可分为 比较类排序也有更细致分法,有基于交换基于插入基于选择基于归并,更细致可以看下面的脑图。 ?...归并排序 归并和快排都是「基于分治算法,分治算法其实应用挺多,很多分治会用到递归,但事实上「分治和递归是两把事」。分治就是分而治之,可以采用递归实现,也可以自己遍历实现非递归方式。

28520

DeepMind新研究TransNAR:给模型嵌入「算法推理大脑」

将TransformerNLU技能与基于GNN神经算法推理器(NAR)强大算法推理能力相结合,可以实现更加泛化、稳健、准确LLM推理。...于是DeepMind研究人员想到了混合架构——将Transformers语言理解能力与基于图神经网络(GNN)神经算法推理器(NAR)稳健性结合起来,提升其算法推理能力。...预训练NAR 论文使用CLRS-30基准中问题预训练了一个多任务、基于MPNNNAR,输入问题规模最多达16个。...数据集 训练数据使用CLRS-Text基准,即CLRS-30基准文本版本,以确定性方式直接从基于CLRS-30中派生,因此这两个数据集传达是完全相同信息。...例如,在对数字列表进行排序任务中,输出不应包含任何字母。 3. CLRS分数:输出中与真实答案匹配元素百分比,也常用于CLRS-30测试。形状分数为0时,CLRS分数也会自动置零。

5610

十大排序算法总结(Python3实现)

目录 一、概述 二、算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11....小编在学习了数据结构、算法分析设计、C/C++、Java、Python等之后,回顾所学发现见到最多还是各种排序算法,故决定做个总结。阅读参考网上各路大神博客之后,写下这篇博客与大家交流。...基本排序算法在经过前人呕心沥血研究下基本可以分为以下十种,当然除此之外,还有结合多种算法思想基于他们改进变种。...基于分治递归思想归并排序将待排数据像二叉树一样分化至最简单一个数排序问题,子问题合并时间复杂度可控制在O(n),不难想到整体时间复杂度取决于树深度,即达到O(nlogn)。...6.快速排序大名鼎鼎,又有个好名字,但最坏情况下时间复杂度直逼O(n^2),远不如堆排序归并排序。 7.基于比较排序算法(如前七种)时间复杂度O(nlogn)已是下限。

53110

程序员必知必会十大排序算法

绪论 身为程序员,十大排序是是所有合格程序员所必备和掌握,并且热门算法比如快排、归并排序还可能问比较细致,对算法性能和复杂度掌握有要求。...对于排序分类,主要不同维度比如复杂度来分、内外部、比较非比较等维度来分类。我们正常讲十大排序算法是内部排序,我们更多将他们分为两大类:基于「比较和非比较」这个维度去分排序种类。...也有很多人将排序归纳为8大排序,那就是因为基数排序计数排序是建立在桶排序之上或者是一种特殊排序,但是基数排序计数排序有它特有的特征,所以在这里就将他们归纳为10种经典排序算法。...而比较类排序也可分为 比较类排序也有更细致分法,有基于交换基于插入基于选择基于归并,更细致可以看下面的脑图。 ?...归并排序 归并和快排都是「基于分治算法,分治算法其实应用挺多,很多分治会用到递归,但事实上「分治和递归是两把事」。分治就是分而治之,可以采用递归实现,也可以自己遍历实现非递归方式。

31720

「干货总结」程序员必知必会十大排序算法

绪论 身为程序员,十大排序是是所有合格程序员所必备和掌握,并且热门算法比如快排、归并排序还可能问比较细致,对算法性能和复杂度掌握有要求。...对于排序分类,主要不同维度比如复杂度来分、内外部、比较非比较等维度来分类。我们正常讲十大排序算法是内部排序,我们更多将他们分为两大类:基于「比较和非比较」这个维度去分排序种类。...也有很多人将排序归纳为8大排序,那就是因为基数排序计数排序是建立在桶排序之上或者是一种特殊排序,但是基数排序计数排序有它特有的特征,所以在这里就将他们归纳为10种经典排序算法。...而比较类排序也可分为 比较类排序也有更细致分法,有基于交换基于插入基于选择基于归并,更细致可以看下面的脑图。 ?...归并排序 归并和快排都是「基于分治算法,分治算法其实应用挺多,很多分治会用到递归,但事实上「分治和递归是两把事」。分治就是分而治之,可以采用递归实现,也可以自己遍历实现非递归方式。

24620

一篇解决排序算法

》体会 算法 详细介绍 算法渣-排序-冒泡 冒泡排序,应该是很多人会且只会算法;两两比较交换 为了减小比较与交换次数,通过双向比较(鸡尾酒排序)、设定是否交换位实现 算法渣-排序-快速排序 快速排序...而选择排序不同,它必须是读完所有的数据之后才能开始排序 算法渣-排序-堆排序排序,借助堆数据结构,构造堆结构,选取堆顶元素,不再需要遍历所有元素选择 ---- 算法渣-排序-归并排序 归并排序,也是分治思想...而快速排序正好相反,它过程是由上向下,先分出两个子区间,再对子区间进行排序 ---- 算法渣-排序-基数排序 算法渣-排序-桶排序 算法渣-排序-计数排序 线性排序算法,非基于比较排序算法,性能很高...此时归并排序是一个比较优秀算法 试题 【京东】假设你只有100Mb内存,需要对1Gb数据进行排序,最合适算法是( ) A. 归并排序  B. 插入排序  C. 快速排序  D....而堆排序在最坏情况下复杂度也为O(logn),所以这里我们应该选择堆排序 参考资料 基于比较内部排序总结 常见比较排序算法耗时测试

47830
领券