【发布时间】:2018-04-08 13:16:13
【问题描述】:
这个问题出现在 Code jam 2018 资格赛已经结束。
https://codejam.withgoogle.com/2018/challenges/(问题2)
问题描述:
标准冒泡排序算法的基本操作是检查一对相邻的数字,如果左边的数字大于右边的数字,则反转该对。但是我们的算法检查一组三个相邻的数字,如果最左边的数字大于最右边的数字,它会反转整个组。因为我们的算法是“三元冒泡排序”,所以我们简称为Trouble Sort。
我们期待在特别节目中展示麻烦排序 夏威夷分拣兴趣小组会议,但我们的实习生之一 刚刚指出了一个问题:Trouble Sort 有可能 没有正确排序列表!以列表 8 9 7 为例。
我们需要您的帮助进行进一步的研究。给定一个列表 N 整数,确定故障排序是否会成功排序 以非递减顺序排列。如果没有,请查找索引 (从 0 开始计数)的第一个排序错误后 算法已经完成:即第一个大于的值 算法完成后紧随其后的值。
因此,一种天真的方法是对给定列表应用故障排序,对列表应用正常排序,然后找到第一个不匹配元素的索引。但是,对于非常大的 N,这会超时。
这是我的想法: 该算法会将第 0 个索引与第 2 个、第 2 个与第 4 个等进行比较。 类似地,第 1 和第 3、第 3 和第 5 等等。
奇数索引处的所有元素将根据奇数索引进行排序。偶数索引元素也是如此。 所以问题在于两个连续的奇数/偶数索引元素之间。
如果不使用 O(n^2) 方法,我想不出办法。
我的方法可行吗,还是有更简单的方法?
【问题讨论】:
-
@PeterdeRivaz 我不知道我是怎么错过的!谢谢。