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轮