AcWing 107. 超快速排序

2024-03-08 20:12
文章标签 快速 排序 acwing 107

本文主要是介绍AcWing 107. 超快速排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N=500000+10;//a 是原来的数组,temp 是临时数组
int a[N],temp[N];//因为元素有 500000 个,逆序对的数目可能会非常多
//假设按照降序排列,那么将有 n+(n-1)+(n-2)+...+1
//(1+n)*n/2
//超出了 int 的数据范围,所以需要使用 long long
//下面是归并排序
LL merge(int l,int r)
{if(l>=r)return 0;int mid=(l+r)>>1;//递归处理LL res=merge(l,mid)+merge(mid+1,r);int i=l,j=mid+1,k=0;while(i<=mid&&j<=r){if(a[i]<=a[j])temp[k++]=a[i++];else{temp[k++]=a[j++];//左边的数组的下标一定小于右边的数组//此时的元素的数值反而大于右边的元素//符合逆序对的要求//所以添加到答案里面res+=mid-i+1;}}//等一个数组处理完之后,另一个数组大概率是没有处理完的//所以处理一下剩下的数组元素while(i<=mid)temp[k++]=a[i++];while(j<=r)temp[k++]=a[j++];//把临时数组的元素放回原来的数组//表示原来的元素被归并排序了for(i=l,j=0;i<=r;i++,j++)a[i]=temp[j];return res;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int n;while(cin>>n){if(n==0)break;for(int i=0;i<n;i++)cin>>a[i];//0 和 n-1 表示的是左右边界cout<<merge(0,n-1)<<endl;}return 0;
}

归并排序求逆序对

该题交换相邻的两个元素来实现排序,问最少需要操作多少次可以使得原来的数组按照升序排序,输出这个操作次数

观察发现答案就是逆序对的数目,该题转换为求逆序对的数目,求逆序对的数目需要使用归并排序的思路

归并排序需要注意的是,可能会超出 int 的数据范围,参数是左右边界,需要一定的递归的思想,归并排序的步骤是把一个数组分成两个排序好的部分,再把这两个部分合成一个部分,在这个过程中求出答案,也就是逆序对的数目

这篇关于AcWing 107. 超快速排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/788258

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

乐鑫 Matter 技术体验日|快速落地 Matter 产品,引领智能家居生态新发展

随着 Matter 协议的推广和普及,智能家居行业正迎来新的发展机遇,众多厂商纷纷投身于 Matter 产品的研发与验证。然而,开发者普遍面临技术门槛高、认证流程繁琐、生产管理复杂等诸多挑战。  乐鑫信息科技 (688018.SH) 凭借深厚的研发实力与行业洞察力,推出了全面的 Matter 解决方案,包含基于乐鑫 SoC 的 Matter 硬件平台、基于开源 ESP-Matter SDK 的一

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

七种排序方式总结

/*2018.01.23*A:YUAN*T:其中排序算法:冒泡排序,简单排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序*/#include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10000#define FALSE 0#define TRUE 1typedef struct {i

拓扑排序——C语言

拓扑排序(Topological Sorting)是一种用于有向无环图(DAG)的排序算法,其输出是图中所有顶点的线性排序,使得对于每条有向边 (u, v),顶点 u 在 v 之前出现。拓扑排序确定了项目网络图中的起始事件和终止事件,也就是顶点的执行顺序。         因为是有向无环图,所以拓扑排序的作用其实就是把先发生的排序在前面,后发生的排序到后面。 例如现在我们有一个

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2  5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度)时间复杂度越低,效率越高, 5.5 低储存(空间复杂度)空间复杂度越低,存储空间越少 6.排序算法 6.1 冒

【Spring】Spring Boot 快速入门

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 小杨近些在学习人工智能方面的知识,发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一

Sublime Text 快速折叠CSS代码到一行

快速折叠CSS代码到一行 1.使用HTML/CSS/JS Prettify或者CSScomb美化代码 2.使用Alt+F3特征选取,删除下图中所有的特征空格 3.使用Ctrl+Shift+M选取括号里的内容,再使用一次Ctrl+Shift+M将大括号也一起选中。 4.使用Ctr+J折叠代码 5.Home键 6.Backspace键

一篇文章带你快速入门java

文章目录 一、一个简单的java代码1.1 Java程序的结构由三个不成组成:1.2 运行java程序1.3 JDK,JRE,JVM之间的关系?(面试题)1.4 标识符1.5 注释1.6 关键字 一、一个简单的java代码 public class HelloJava {public static void main(String[] args) {System.out.