Acwing 快排 归并 整理笔记

简介: Acwing 快排 归并 整理笔记

20f5b6f1ee93439a99cd254fa4d77a5c.png

快速排序:

快排板子分治思想

1.确定分界点(x = a[l+r>>1]),这么做是为了避免有序的情况下,子问题规模依旧较大的问题(如果有序且分界点取在首个,那么数组被分为长度1和n-1)

2.调整区间,使得第一个区间<=x,第二个区间>=x;

3.递归两个区间

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5+10;
int a[N];
void quicksort(int l,int r,int a[])
{
    if (l>=r) return;
    int i = l-1,j = r+1,x = a[i+j>>1];
    while (i<j)
    {
        do i++;while (a[i]<x);
        do j--;while (a[j]>x);
        if (i<j) swap(a[i],a[j]);
    }
    quicksort(l,j,a);
    quicksort(j+1,r,a);
}
int main()
{   
    int n;
    scanf("%d",&n);
    for (int i = 0;i<n;i++) scanf("%d",&a[i]);
    quicksort(0,n-1,a);
    for (int i = 0;i<n;i++) printf("%d ",a[i]);
    return 0;
}

归并排序


20ab39b2b4f04a1f8dd3705810a065ad.png


1:确定分界点

2:递归

3:归并merge(注意可能一条链子输完了另一条还没有输完的情况)

归并板子

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5+10;
int tmp[N];//临时容器
int a[N];
void mergesort(int l,int r,int a[])
{
    if (l>=r) return ;
    int mid = l+r>>1;//划分区间
    mergesort(l,mid,a);
    mergesort(mid+1,r,a);//递归排序
    int i = l,j = mid+1,k =0;
    while (i<=mid&&j<=r)//双指针
    {
        if (a[i]<=a[j]) tmp[k++] = a[i++];
        else tmp[k++] = a[j++];
    }
    while (i<=mid) tmp[k++] = a[i++];
    while (j<=r) tmp[k++] = a[j++];//收尾
    for (int i = l,j = 0;j<k;j++,i++) a[i] = tmp[j];//复制到到原数组
}
int main()
{   
    int n;
    scanf("%d",&n);
    for (int i = 0;i<n;i++) scanf("%d",&a[i]);
    mergesort(0,n-1,a);
    for (int i = 0;i<n;i++) printf("%d ",a[i]);
    return 0;
}

经典例题:逆序对的数量:acwing788

给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。

输入样例:

1. 6
2. 2 3 4 5 6 1

输出样例:

5

逆序对分成三块,前两块ans加上函数自身的递归,第三块先排序再累加;

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const LL N = 1e5+10;
LL a[N],tmp[N];
LL mergesort(LL l,LL r,LL a[])
{   
    if (l>=r) return 0;
    LL mid = l+r>>1;
    LL ans = 0;
    ans+=mergesort(l,mid,a)+mergesort(mid+1,r,a);
    LL i = l,j = mid+1,k = 0;
    while (i<=mid&&j<=r)
    {
        if (a[i]<=a[j]) tmp[k++] = a[i++];
        else
        {
            tmp[k++] = a[j++];
            ans += mid-i+1;
        }
    }
    while (i<=mid) tmp[k++] = a[i++];
    while (j<=r)   tmp[k++] = a[j++];
    for (LL i = 0,j = l;i<k;i++,j++)  a[j] = tmp[i];
    return ans;
}
int main()
{
    LL n;
    scanf("%ld",&n);
    for (int i = 0;i<n;i++) scanf("%ld",&a[i]);
    LL ans = mergesort(0,n-1,a);
    printf("%ld",ans);
    return 0;
}

24839e48d8354f78a2d6d4b36151c074.png


1cd7edfae477414eb259b78ee9896f5d.png


相关文章
|
缓存 编译器 程序员
【Qt 元对象系统04】 深入浅出Qt的QMetaObject:探索元对象的魔法
【Qt 元对象系统04】 深入浅出Qt的QMetaObject:探索元对象的魔法
1492 0
|
消息中间件 NoSQL Java
Spring Cloud项目实战Spring Cloud视频教程 含源码
Spring Cloud项目实战Spring Cloud视频教程 含源码
479 1
|
自然语言处理 API Swift
Qwen1.5开源!魔搭最佳实践来啦!
近几个月来,通义千问团队一直在努力探索如何构建一个“好”的模型,同时优化开发者体验。就在刚刚,中国新年前夕,通义千问团队分享了Qwen开源系列的下一个版本,Qwen1.5。
|
6月前
|
人工智能 安全
阿里巴巴 AI Coding 分享会 Qoder Together 杭州站诚邀你的参与!
Qoder Together ,不止技术分享,更是思维共振与灵感迸发。我们面向全球 AI Coding 爱好者,邀请 Qoder 团队、实战用户、AI Coding 探索者齐聚一堂,交流激发创意,碰撞拓展边界,重新定义智能编程未来。
440 0
|
8月前
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
498 0
|
10月前
|
人工智能 开发者
阿里云百炼X支付宝:「AI打赏」功能上线,Agent变现更灵活🎉🎉🎉
阿里云百炼平台联合支付宝,推出业内首个Agent「AI打赏」功能,开发者可为应用一键配置赞赏功能,用户打赏金额将直接转入开发者支付宝账户,助力快速变现。
946 1
|
7月前
|
存储 人工智能 弹性计算
阿里云权益中心详解:个人开发者与企业用户和高校学生与教师的综合优惠平台
阿里云权益中心是什么?简单来说,它是一个致力于为高校学生和教师、个人开发者、企业用户提供优惠上云和快速上云的平台,本文将深度解析权益中心的核心活动、适用场景及参与方式,以供您了解和参考。
|
9月前
|
人工智能 缓存 监控
智能体性能优化:延迟、吞吐量与成本控制
作为一名深耕AI领域多年的技术博主摘星,我深刻认识到智能体(AI Agent)性能优化在当今人工智能应用中的关键地位。随着大语言模型和智能体技术的快速发展,如何在保证服务质量的前提下优化系统性能、控制运营成本,已成为每个AI从业者必须面对的核心挑战。在我多年的实践经验中,我发现许多团队在部署智能体系统时往往只关注功能实现,而忽视了性能优化的重要性,导致系统在高并发场景下响应缓慢、成本居高不下,最终影响用户体验和商业价值。本文将从性能瓶颈识别与分析、模型推理优化技术、缓存策略与并发处理、成本效益分析与优化四个维度,系统性地探讨智能体性能优化的核心技术和最佳实践。通过深入分析延迟(Latency)
969 0
智能体性能优化:延迟、吞吐量与成本控制
|
存储 监控 NoSQL
震撼!揭秘高可用 MongoDB 分片集群搭建的神秘魔法,开启数据存储的无敌模式!
【8月更文挑战第9天】在数字化时代,数据至关重要。MongoDB作为流行非关系型数据库,通过搭建高可用分片集群确保系统稳定性和性能。分片技术将大数据集分布于多服务器以实现水平扩展。搭建集群需准备服务器资源,配置环境,启动配置服务器、路由服务器及分片服务器,并设置分片策略。例如,对特定数据库和集合启用分片。此架构适用于高流量应用如大型电商平台,确保数据高效处理和高可用性。搭建过程需持续监控和优化,合理规划分片策略以维持系统稳定运行。
277 3