IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 归并排序的简单介绍C++ -> 正文阅读

[C++知识库]归并排序的简单介绍C++

归并排序简单介绍



前言

我们会经常处理排序的问题,归并排序就是排序当中的一种


提示:以下是本篇文章正文内容,下面案例可供参考

一、归并排序是什么?

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。

这里我们用一个题目来讲解

AcWing 787. 归并排序
在这里插入图片描述

二、使用步骤

1.处理分界点

在这里插入图片描述

此时分界点 mid = l + r >> 1 l + r >> 1 就是 (l + r) / 2
代码如下(示例):

int mid = l + r >> 1;

2.递归排序left和right

处理好分解点之后我们就把分好的左右两边的值都进行递归
此时需要运用的merge_sort 函数
代码如下(示例):

merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);

3. 归并————合二为一

此时我们需要把处理好的的left和right合并在一起
在这里插入图片描述
总结上述3点我们处理的代码如下

#include<iostream>

using namespace std;

const int N = 1e5 + 10;

int q[N], ans[N]; // ans用来存储我们得到的正确排序
int n;

void merge_sort(int q[], int l, int r)  // 归并排序
{
    if(l >= r) return ;
    int mid = l + r >> 1;
    
    merge_sort(q, l, mid); //将left递归
    merge_sort(q, mid + 1, r); //将right递归
    
    int k = 1, i = l, j = mid + 1; //k = 1,将ans设成下表为k = 1开始的数组
    while(i <= mid && j <= r)
    {
        if(q[i] <= q[j]) ans[k ++] = q[i ++];
        else ans[k ++] = q[j ++]; // 将两个数组合并在一起
    }
    while(i <= mid) ans[k ++] = q[i ++]; //存储剩下还未放入的数组
    while(j <= r) ans[k ++] = q[j ++];
    
    for (i = l, j = 1; i <= r; i++, j++) q[i] = ans[j];
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n ; i++) cin >> q[i];
    
    merge_sort(q, 1, n);
    
    for (int i = 1; i <= n; i ++ ) cout << q[i] << " "; 
    
    cout << endl;
    
    return 0;
}

三.强化训练

1.例题介绍

Acwing788. 逆序对的数量
在这里插入图片描述
这个题呢其实只需要在判断q[i] > q[j]的时候加上一个res += mid - i + 1;
见代码如下

#include<iostream>

using namespace std;

typedef long long LL; //因为该题的数据会有点大
const int N = 1e5 + 10;

int q[N], ans[N];
int n;

LL merge_sort(int l, int r)  // 归并排序
{
    if(l >= r) return 0;
    int mid = l + r >> 1;
    LL res = merge_sort(l, mid) + merge_sort(mid + 1, r);
    //加上left和right递归排序的时候的q[i] > q[j]时的次数
    
    //归并的过程
    int k = 1, i = l, j = mid + 1;
    while(i <= mid && j <= r)
    {
        if(q[i] <= q[j]) ans[k ++] = q[i ++];
        else 
        {
            ans[k ++] = q[j ++];
            res += mid - i + 1;
        }
    }
    while(i <= mid) ans[k ++] = q[i ++]; 
    while(j <= r) ans[k ++] = q[j ++];
    
    for (i = l, j = 1; i <= r; i++, j++) q[i] = ans[j];
    
    return res;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n ; i++) cin >> q[i];
    

    
    cout << merge_sort(1, n) << endl;
    //for (int i = 1; i <= n; i ++ ) cout << q[i] << " "; 
    
    
    return 0;
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了归并排序的使用,而归并排序提供了我们一个可以将数字排列的方法,并用这种方法进行延伸拓展

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:26:28  更:2021-07-31 16:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 8:45:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码