重新排列奇数和偶数
Posted
技术标签:
【中文标题】重新排列奇数和偶数【英文标题】:Rearrange odd and even numbers 【发布时间】:2016-06-13 01:55:55 【问题描述】:是否有一个 O(n) 算法来并保持顺序?辅助数组可用于中间结果,但重排应在数组内完成。
我发现这个http://www.geeksforgeeks.org/segregate-even-and-odd-numbers/ 可以做需要做的事情,但它不能维持秩序
Input:
1 4 3 8 6 5 7
Output:
1 3 5 7 4 8 6
【问题讨论】:
输入总是排序的吗?如果不是,那么就不可能完成 O(n) 你为什么要问“那里...”?你知道有一个吗?你需要一个吗? 数列是任意的吗?如果是这样,请在您的示例中反映这一点,因为您提出的方式会使读者感到困惑。 是的,数字顺序是任意的。我想知道是否有办法在两遍算法中做到这一点。因为总体复杂度仍然是 O(n)。辅助数组可用于中间结果,但重排应在数组内完成 【参考方案1】:这个怎么样?
-
创建两个双向链表(或具有 O(1) 级联的东西)以分别存储奇数和偶数。
遍历输入列表,将它们分离到步骤 1 中的列表。
连接两个列表。
【讨论】:
您的第三步应该是“从列表的内容中填充数组”。但是,如果您不必这样做,那么使用真正的链表会很痛苦...... @Amit ,我想这取决于;我发现链接数据结构更容易推理。它还取决于编程语言,像 Haskell 这样的纯函数式语言可能更喜欢链表而不是数组。 我认为问题是关于数组(输入和输出),但实际上它并没有说明什么。它确实说(现在,编辑后)没有辅助数组,所以我想这意味着你的答案也无效。但是,使用链表,您不需要任何辅助结构,只需将项目移动到正确的位置即可。这是O(n)。 @Amit,对,如果问题需要数组,我的答案有额外的 O(n) 内存要求,而不是 O(1) 的链表。但这仍然是 O(n) 时间复杂度。以上是关于重新排列奇数和偶数的主要内容,如果未能解决你的问题,请参考以下文章