将数字列表排序为交替的低 - 高 - 低序列的最有效方法是什么?

时间:2014-01-01 18:37:13

标签: algorithm list sorting

假设给出了一个未排序的正整数列表,并且您希望以这样的方式对它们进行排序:元素交替为:(小于前一个元素),(大于前一个元素),(小于前一个元素)等等...输出列表中的第一个元素可能会忽略该规则。例如,假设您的列表是:1,4,9,2,7,5,3,8,6。

一个正确的输出将是...... 1,9,2,8,3,7,4,6​​,5

另一个会...... 3,4,2,7,5,6,1,9,8

假设列表中没有重复项,任意大,并且尚未排序。

实现此目的的处理效率最高的算法是什么?

现在,标准方法是首先按升序对列表进行排序,然后交替从列表末尾剥离元素。但是,我想知道:如果没有先对列表进行排序,是否有更省时的方法呢?

我的理由:(只有在您关心的情况下阅读此内容)

显然,这是我姐姐的男朋友在旧金山的求职面试中给人们提出的问题。我妹妹问了我这个问题,我立刻想出了标准回答。这就是每个人都回答的问题。然而,显然有一个女孩提出了一个完全不同的解决方案,不需要对列表进行排序,它似乎工作。我妹妹无法向我解释这个解决方案,但自从昨晚以来,这个想法让我感到困惑。我很感激任何帮助!谢谢!

2 个答案:

答案 0 :(得分:8)

您可以在O(n)中执行此操作,方法是将每个元素依次放在最后,或者根据与当前最后一个元素的比较放在倒数第二个位置。

例如,

1,4,9,2,7,5,3,8,6
Place 1 at end, current list [1]
4>1 true so place 4 at end, current list [1,4]
9<4 false so place 9 at penultimate position [1,9,4]
2>4 false so place 2 at penultimate [1,9,2,4]
7<4 false so place 7 at penultimate [1,9,2,7,4]
5>4 true so place 5 at end [1,9,2,7,4,5]
3<5 true so place 3 at end [1,9,2,7,4,5,3]
8>3 true so place 8 at end [1,9,2,7,4,5,3,8]
6<8 true so place 6 at end [1,9,2,7,4,5,3,8,6] 

请注意,等式测试是交替的,如果等式为真,我们放在最后,如果不是,则放在倒数第二个位置。

Python代码示例

A=[1,4,9,2,7,5,3,8,6]
B=[]
for i,a in enumerate(A):
    if i==0 or (i&1 and a>B[-1]) or (i&1==0 and a<B[-1]):
        B.insert(i,a)
    else:
        B.insert(i-1,a)
print B

答案 1 :(得分:0)

一个解决方案是这个。在伪代码中给出。

假设nums 至少有两个元素 nums 中的所有元素都是不同的

nums   = [list of numbers]

if nums[0] < nums[1]: last_state = INCREASING else: last_state = DECREASING

for i = 2 to len(nums - 1):
   if last_state = INCREASING:
      if nums[i] > nums[i-1]:
        swap (nums[i], nums[i-1])
      last_state = DECREASING
   else
      if nums[i] < nums[i-1]:
        swap (nums[i], nums[i-1])
      last_state = INCREASING

正确性证明:

在每次循环迭代之后,nums中索引i的元素保持交替,last_state表示ii-1元素的顺序。

请注意,只有在考虑了最后3个项目的情况下才会进行交换。 (增加或减少)因此,如果我们用第i-1个元素交换第i个元素,i-2元素和第i个元素的顺序将不会改变。