题目描述

给一个双向冒泡排序的程序:

moo表示输出moo

sorted = false
while (not sorted):
sorted = true
moo
for i = to N-:
if A[i+] < A[i]:
swap A[i], A[i+]
for i = N- downto :
if A[i+] < A[i]:
swap A[i], A[i+]
for i = to N-:
if A[i+] < A[i]:
sorted = false

再给一个初始的数组。

求把这个数组排好序,输出几次moo

n<=100000,ai<=1e9

题解

考察冒泡排序的本质。

一般的冒泡排序,每次会把最大的数直接沉底,

但是比较小的数,会往前面缓慢冒泡。

具体来说,如果一个数i排名是i,但是位置在i之后,那么,每次循环,i必然会往前面移动一位。

因为必然前面会有一个比i大的数往后沉。

i往前每次移动一次导致复杂度最坏是n^2

swap的次数,就是逆序对数

循环的次数,就是

这个题目,是一个双向的冒泡排序,

对于一个分界点位置i,这个双向排序,每个循环会把一个i之前的大于i的数移到i后面,并且把一个i后面小于i的数移到i的前面。

单向冒泡不能保证每次把一个i后面的小于i的数放到i前面。

排好序是什么意思?

就是说,对于任意的位置i,小于i的数都在i前面,大于i的数都在i后面。

所以 ,我们可以对于所有的位置i,找到i前面比i小的数个数s,i-s就是i位置把小于i的放在i前面,大于i的放在i后面的循环次数。

例如 5 2 3 1 4 双向冒泡可以一次排完。单向冒泡瓶颈在“3”

对于这些次数取一个mx即可。

用树状数组离散化后可以做。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=+;
int n,ans;
int a[N],b[N],cnt[N];
int f[N];
void add(int x){for(;x<=n;x+=x&(-x)) f[x]++;}
int query(int x){int ret=;for(;x;x-=x&(-x))ret+=f[x];return ret;}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);b[i]=a[i];
}
sort(b+,b+n+);ans=;
for(int i=;i<=n;i++){
int t=lower_bound(b+,b+n+,a[i])-b;
//cout<<" tt "<<t<<endl;
add(t);
cnt[i]=query(i);ans=max(ans,i-cnt[i]);
}printf("%d",ans);return ;
}

注意,当数组排好序之后,因为一定要检查一遍,所以moo还是1的。不是0

upda:2019.9.20

这个是通过位置来处理最大值的

还可以通过数值,每个数值每次会有一个在前面且比它大的数放到后面去,而每次会有一个在后面比它小的数到前面去。

同理离散化+树状数组,for i=1~n      ans =max(ans,max(number of front and big,number of back and small))

[USACO18OPEN]Out of Sorts G 冒泡排序理解之一的更多相关文章

  1. [USACO18OPEN]Out of Sorts P 冒泡排序理解之二

    题目描述 Bessie把快速排序和冒泡排序混在了一起 给一个伪快排的代码: 冒泡: bubble_sort_pass (A) { to length(A)- ], swap A[i] and A[i+ ...

  2. 洛谷 P4375 [USACO18OPEN]Out of Sorts G(树状数组求冒泡排序循环次数加强版)

    传送门:Problem 4375 参考资料: [1]:https://www.cnblogs.com/Miracevin/p/9662350.html [2]:https://blog.csdn.ne ...

  3. 洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)

    传送门:Problem P4378 https://www.cnblogs.com/violet-acmer/p/9833502.html 要回宿舍休息了,题解明天再补吧. 题解: 定义一数组 a[m ...

  4. bzoj 5277: [Usaco2018 Open]Out of Sorts【冒泡排序瞎搞】

    首先考虑快排的递归什么时候停下,显然是当前段只剩下一个数了,也就是一个数两边出现分隔符 然后再考虑计算冒泡长度这个操作,因为有分割,所以我们可以把这些放到一起冒泡,这和递归每个区间冒泡是等价的 所以答 ...

  5. Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...

  6. SED总结, mac上要加备份文件名,sort命令和对中文的处理

    使用sed批量改文件名 Sed批量去拓展名 |- dev.gb.conll06.raw |- test.gb.conll06.raw |- train.gb.conll06.raw 想要去掉其中的后缀 ...

  7. 软件工程导论-目录-K-T+RJ大

    目录 10 第1章 软件工程学概述/1 19 1.1 软件危机/1 19 1.1.1 软件危机的介绍/1 19 1.1.2 产生软件危机的原因/3 21 1.1.3 消除软件危机的途径/4 22 1. ...

  8. C语言学习笔记---谭浩强

    前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数 ...

  9. 前端技术-svg简介与snap.svg.js开源项目的使用

    前言-为什么学习snap.svg.js 前阵子webAPP的技术群里有人感觉到svg+animate的形式感觉很炫,矢量图任意放大且不需要下载图片,并且在手机端效果流畅. (矢量图与位图最大的区别是, ...

随机推荐

  1. typedef你真的理解么?

    typedef,用最简单的话去诠释他,那么就是给类型取别名!!!  但是他并没有你想象的那么简单! 举例: typedef int size;//那么int就有一个别名叫size了,以后就可以 siz ...

  2. 【php增删改查实例】第五节 - easyUI的基本使用

    1. 列表组件 datagrid 1.1 创建一个grid.html <html> <head> <meta charset="utf-8" /> ...

  3. Kubernetes学习之路(二十三)之资源指标和集群监控

    目录 1.资源指标和资源监控 2.Weave Scope监控集群 (1)Weave Scope部署 (2)使用 Scope (3)拓扑结构 (4)实时资源监控 (5)在线操作 (6)强大的搜索功能 2 ...

  4. stl源码剖析 详细学习笔记 算法(2)

    //---------------------------15/03/29---------------------------- //****************************set相 ...

  5. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

    本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...

  6. Microsoft Dynamics CRM 常用JS语法(已转成vs2017语法提示)

    背景 最近接触到Microsoft Dynamics CRM的开发.前端js是必不可少的部分,奈何没有一个语法提示,点不出来后续的语句. 在vscode上面搜索插件的时候发现,有一个大神写的插件htt ...

  7. 物理机通过http访问eNSP虚拟Server

    由于测试需要,本文主要通过一个简单的例子介绍通过物理机的浏览器访问华为eNSP虚拟Server,访问网页. 1.首先配置虚拟网卡的地址 2.通过华为的eNSP模拟软件,做出如下拓扑结构图,配置地址如图 ...

  8. Unity 音频合并

    将多个音频组合起来进行播放 代码如下: ; [SerializeField] AudioClip s1; [SerializeField] AudioClip s2; [SerializeField] ...

  9. coinmarketcap前20之cardano卡尔达诺(ADA艾达币)

    1. 在开始讲述cardano前,我先说说自己在coinmarketcap前20系列的"学习方法". 最初,我把前20做了一个简单表格,不做任何功课的基础上,记录自己对它们的简要认 ...

  10. @PathVariable获取带点参数,获取不全

    {account:.+}在{account}后加上:.+ 可参考原博:http://blog.csdn.net/jrainbow/article/details/46126179