34.哀家要长脑子了!--归并排序

news/2024/7/8 7:54:12 标签: 数据结构
1.787. 归并排序 - AcWing题库

① 确定分界点 mid = l + r >> 1

② 递归排序 左边右边

③ 合并有序数组

模板:

void merge_sort(int q[], int l, int r){
    if(l >= r)    return 0;
    
    int mid = l + r >> 1;
    
    merge_sort(q, l ,mid), merge_sort(q, mid+1, r);
    
    int i = l, j = mid+1, k =0;
    // 归并
    while(i <= mid && j <= r)
        if(q[i] < q[j])     tmp[k++] = q[i++];
        else     tmp[k++] = q[j++];
    
    // 扫尾
    while(i <= mid)    tmp[k++] = q[i++];
    while(j <= r)    tmp[k++] = q[j++];
    
    // 物归原主
    for(int i = l, j = 0; j < k; i++, j++)    q[i] = tmp[j];
}
 
int main(){
    merge_sort(q, 0, n-1);
}

tmp数组用来存放有序的部分

2.788. 逆序对的数量 - AcWing题库

首先看题目,知道什么是逆序数对。

可以一边归并排序一边计算有序数对

当i > j 并且 q[i] < q[j]的时候,因为这两部分都是有序数组。那么对于q[j]这个点,q[i]以后所有的数都可以跟q[j]构成逆序数对,所以针对q[j]这个数字可以构成的逆序数对有 res = mid - i  + 1 个,让然后左右两边都这么递归计算就好。

注意题目的范围是100000,当最差的情况是这个数组是逆序的,等差数列求和算一下逆序对数量会超过INT_MAX

#include<iostream>
using namespace std;

const int N = 1e5+10;

typedef long long ll;
ll q[N], tmp[N];

ll merge_sort(ll l, ll r){
    if(l >= r) return 0;
    
    ll mid = l + r >> 1;
    ll res = merge_sort(l, mid) + merge_sort(mid+1, r);
    
    ll i = l, j = mid+1, k = 0;
    
    
    while(i <= mid && j <= r){
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else{
            tmp[k++] = q[j++];
            res += mid - i + 1;
        }
    }
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++]; 
    
    for(int i = l, j = 0; j < k; i++,j++) q[i] = tmp[j];
    
    return res;
}

int main(){
    ll n; 
    cin >> n;
    
    for(int i = 0; i < n; i++){
        cin >> q[i];
    }
    
    ll res = merge_sort(0, n-1);
    cout << res;
}


http://www.niftyadmin.cn/n/5536817.html

相关文章

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中&#xff0c;三个非常重要的工具和库&#xff1a;Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析&#xff0c;NumPy专注于数值计算和数学运算&#xff0c;而Matplotlib则负责数据可视化。这三个库相…

[2024]docker-compose实战 (1)前言

前言 本文用来记录使用docker-compose来实战搭建一个多项目的测试环境. 环境中包含nodejs, php, html, redis, MongoDB, mysql. 在本次部署流程中, 尽量保证原镜像的"干净简洁", 尽量不会往镜像中加入各种软件和插件, 所有的配置尽可能的在宿主机映射进去. 项目…

【前端】IntersectionObserver 实现图片懒加载和无限滚动

【前端】IntersectionObserver 实现图片懒加载和无限滚动 在前端开发中&#xff0c;性能优化是一个重要的考量因素。随着现代网页和应用的复杂性增加&#xff0c;确保页面快速加载和流畅运行变得越来越重要。本文将介绍一种强大的工具——IntersectionObserver API&#xff0c…

软件测试面试题:Redis的五种数据结构,以及使用的场景是什么?

字符串&#xff08;Strings&#xff09;&#xff1a;简单直接&#xff0c;就像记事本一样&#xff0c;用来存储和快速访问简单的数据&#xff0c;比如缓存网页或者保存用户会话信息。 列表&#xff08;Lists&#xff09;&#xff1a;有序的数据集合&#xff0c;适合用来存储按…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展&#xff0c;用于运行用户脚本&#xff0c;这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务&#xff0c;比如自动填写表单、移除广告、改变页面布局等。适用浏览器&#xff1a; Tampermonkey 适用于多数主流浏览…

案例分享:数据集市搭建方案中集成SQLFlow数据血缘分析工具

本文中描述的数据集市搭建方案是一家跨国公司在AWS平台上的具体实践案例。我公司参与其中的数据血缘部分的建设&#xff0c;SQLFlow数据血缘分析工具在该方案中帮助用户实现了数据血缘分析。 用户使用Redshift 数据库仓库进行数据集市开发。从各种数据源提取数据&#xff0c;并…

openwrt 23.05.2 稳定版本 导入树莓派4B

openwrt 23.05.2 稳定版本 导入树莓派4B 强烈建议新手使用稳定版本 这里真的非常感谢这篇博客提供了大量支持&#xff0c;本文有大量篇幅抄袭。 https://blog.csdn.net/qq_44730817/article/details/135258664 编译系统&#xff08;Build system usage&#xff09; 下载源代…

秋招突击——设计模式补充——简单工厂模式和策略模式

文章目录 引言正文简单工厂模式策略模式策略模式和工厂模式的结合策略模式解析 总结 引言 一个一个来吧&#xff0c;面试腾讯的时候&#xff0c;问了我单例模式相关的东西&#xff0c;自己这方面的东西&#xff0c;还没有看过。这里需要需要补充一下。但是设计模式有很多&…