当前位置: 首页 > news >正文

107. 超快速排序

107. 超快速排序

在这个问题中,您必须分析特定的排序算法----超快速排序。
该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列,直到序列按升序排序。
对于输入序列 9 1 0 5 4,超快速排序生成输出 0 1 4 5 9。
您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。

输入格式
输入包括一些测试用例。

每个测试用例的第一行输入整数 n,代表该用例中输入序列的长度。

接下来 n行每行输入一个整数 ai,代表用例中输入序列的具体数据,第 i
行的数据代表序列中第 i个数。
当输入用例中包含的输入序列长度为 0时,输入终止,该序列无需处理。

输出格式
对于每个需要处理的输入序列,输出一个整数 op,代表对给定输入序列进行排序所需的最小交换操作数,每个整数占一行。

数据范围
0≤n<500000,
一个测试点中,所有 n的和不超过 500000。
0≤ai≤999999999
输入样例:
5
9
1
0
5
4
3
1
2
3
0
输出样例:
6
0
解题思路
归并排序的过程中顺便统计逆序对的数量。

#include<iostream>
#include<cstring>
#include<algorithm>typedef long long ll;const int N =500010;int n;
ll q[N],w[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);int i=l,j=mid+1,k=0;while(i<=mid&&j<=r){if(q[i]<=q[j]) w[k++] = q[i++];else{res+=mid-i+1;//统计逆序对的数量w[k++]=q[j++];}}while(i<=mid) w[k++]=q[i++];while(j<=r) w[k++]=q[j++];for(i=l,j=0;i<=r;i++,j++) q[i]=w[j];return res;}int main(){while(scanf("%d",&n),n){for(int i=0;i<n;i++) scanf("%d",&q[i]);printf("%lld\n",merge_sort(0,n-1));}return 0;
}

http://www.mrgr.cn/news/28646.html

相关文章:

  • 数据仓库面试题集离线实时
  • 2分钟在阿里云ECS控制台部署个人应用(图文示例)
  • Visual Studio 2022 安装
  • WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等
  • SpringBoot单体服务无感更新启动,动态检测端口号并动态更新
  • PostgreSQL序列:创建、管理与高效应用指南
  • 系统架构设计师教程 第5章 5.7 软件项目管理 笔记
  • [Java]maven从入门到进阶
  • Linux基础---07文件传输及解决yum安装失效的方法
  • 年化60.7%,最大回撤-16.5%,RSRS标准分择时效果差不多
  • pytorch 模型训练太慢怎么办,试一试这17种方法可以优化训练过程,pytorch 提高训练速度的方法 除了num_worker
  • 【小白】一文安装anaconda
  • Java创建者模式(一)——单例设计模式(饿汉式、懒汉式、枚举式 | 完成详解,附有代码+案例)
  • docker容器镜像服务配置
  • Vue学习记录之一(介绍及脚手架的使用)
  • 深入解析 Cursor:AI 驱动的编程工具与应用示例
  • RabbitMQ Spring客户端使用
  • 道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路
  • pytorch训练过程搭建及模型的保存与加载
  • LAMP环境搭建记录:基于VM的Ubuntu虚拟机
  • DFT理论知识 scan insertion详解
  • C++——stack和queue的模拟实现
  • 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
  • Linux per memcg lru lock
  • 编程辅助工具下一个热门应用场景是什么?(二)
  • C++ 带约束的Ceres形状拟合