冒泡排序(优化版)的比较次数和交换数字次数 逆序数+树状数组

本文探讨了冒泡排序的优化方法,详细分析了在排序过程中比较和交换数字的次数。同时,结合树状数组介绍了如何计算序列中的逆序数,进一步提升排序算法的效率和理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://www.contesthunter.org/contest/%E5%85%83%E6%97%A6%E6%AC%A2%E4%B9%90%E8%B5%9B/%E8%BE%9B%E5%B7%B4%E6%9D%A5%E6%8E%92%E5%BA%8F

 

思路:

要求冒泡排序优化以后的趟数和交换次数

交换次数等于逆序数
因为冒泡排序是临对换排序, 临对换一次减少一个逆序对

冒泡的趟数:
求出每个数a[i]的前面比它大的数的个数记为b[i]
答案是max{b[]}+1
最后一趟没有swap
总共冒泡max{b[]}+1这么多趟
因为对于每个数, 每一趟都把它前面比他大的一个数移到了它的后面
max{b[]}趟以后每个数前面都没有比它大的了,。。,,。
整体有序。。,。

(思路来自neko13)

代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
#include<map>
#define N 100010
using namespace std;
int c[N], maxn;
inline in
留意着农场之外的长期职业生涯的可能性,奶牛Bessie开始在不同的在线编程网站上学习算法。 她到目前为止最喜欢的算法是“冒泡排序”。这是Bessie最初的对长度为 𝑁 N的数组 𝐴 A进行排序的奶牛码实现。 sorted = false while (not sorted): sorted = true moo for i = 0 to N-2: if A[i+1] < A[i]: swap A[i], A[i+1] sorted = false 显然,奶牛码中的“moo”指令的作用只是输出“moo”。奇怪的是,Bessie看上去执着于在她的代码中的不同位置使用这个语句。 在用若干个数组测试了她的代码之后,Bessie得到一个有趣的观察现象:大的元素很快就会被拉到数组末尾,然而小的元素需要很长时间“冒泡”到数组的开头(她怀疑这就是为什么这个算法得名的原因)。为了实验缓解这一问题,Bessie试着修改了她的代码,使代码在每次循环中向前再向后各扫描一次,从而无论是大的元素还是小的元素在每一次循环中都有机会被拉较长的一段距离。她的代码现在是这样的: sorted = false while (not sorted): sorted = true moo for i = 0 to N-2: if A[i+1] < A[i]: swap A[i], A[i+1] for i = N-2 downto 0: if A[i+1] < A[i]: swap A[i], A[i+1] for i = 0 to N-2: if A[i+1] < A[i]: sorted = false 给定一个输入数组,请预测Bessie修改后的代码会输出多少次“moo”。 输入格式 输入的第一行包含 𝑁 N( 1 ≤ 𝑁 ≤ 100 , 000 1≤N≤100,000)。接下来 𝑁 N行描述了 𝐴 [ 0 ] … 𝐴 [ 𝑁 − 1 ] A[0]…A[N−1],每个数都是一个范围为 0 … 1 0 9 0…10 9 的整数。输入数据不保证各不相同。 输出格式 输出“moo”被输出的次数。 样例 #1 样例输入 #1 5 1 8 5 3 2 样例输出 #1 2
最新发布
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值