P4375. Out of Sorts G
考点
- 排序
题解
1 |
|
思路
P4378的加强版,假设有下列数组。
值 | 65 | 64 | 63 | 62 | 61 |
---|---|---|---|---|---|
下标 | 1 | 2 | 3 | 4 | 5 |
第一次冒泡排序(正常的冒泡排序)后,成功将元素65
送到了它应去的地方,下标5的位置。
值 | 64 | 63 | 62 | 61 | 65 |
---|---|---|---|---|---|
下标 | 1 | 2 | 3 | 4 | 5 |
第二次排序后,将元素61
送到了下标1的位置
值 | 61 | 64 | 63 | 62 | 65 |
---|---|---|---|---|---|
下标 | 1 | 2 | 3 | 4 | 5 |
可以发现规律,设当前下标为x
,值为arr[x]
:
第一次操作会将x
的左侧,某个大于arr[x]
的元素A
换到x
的右侧,且A
到达正确下标位置;
第二次操作会将x
的右侧,某个小于等于arr[x]
的元素B
换到x
的左侧,且B
到达正确下标位置。
每一轮的双向排序,对于x
而言,就是维护了一次两边的平衡。
那么统计每个x
左边(含自己)有多少个不平衡的下标即可,随后遍历x
打擂台取最大值即为最终轮数。
当然,平衡是对称的,你也可以统计每个x
右边(含自己)有多少个不平衡的下标。
举上面那个例子
值 | 65 | 64 | 63 | 62 | 61 |
---|---|---|---|---|---|
当前下标 | 1 | 2 | 3 | 4 | 5 |
应处下标 | 5 | 4 | 3 | 2 | 1 |
由于平衡是对称的,这里设“不平衡”代表应处下标大于当前下标
(你也可以反过来,结果一样的)
65
的左边不平衡数有{65}
,数量为1
64
的左边不平衡数有{65、64}
,数量为2
63
的左边不平衡数有{65、64}
,数量为2
62
和61
没有左边不平衡数
那么最终结果就是取最大值,2轮