重新排列奇数和偶数

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) 时间复杂度。

以上是关于重新排列奇数和偶数的主要内容,如果未能解决你的问题,请参考以下文章

c语言中 排列偶数与奇数,奇数在后,偶数在前

谁能告诉我excel表格中如何将数字按奇数和偶数依次排列

c++输入n及n个整数,按奇数升序,偶数降序排列输出

输入一个整数数组,输出奇偶数相间排列的数组

openjudge整数奇偶数排序问题,一直是wrong answer,不知问题在哪里

输入 10 个整数,将这 10 个数按升序排列,并且奇数在前偶数在后?