【问题标题】:What is the most efficient way to sort a number list into alternating low-high-low sequences?将数字列表排序为交替的低-高-低序列的最有效方法是什么?
【发布时间】:2014-01-01 18:37:12
【问题描述】:

假设给定一个未排序的正整数列表,并且您希望以这样的方式对它们进行排序,使得元素交替为:(小于前一个元素),(大于前一个元素),(小于前一个元素)等...输出列表中的第一个元素可能会忽略该规则。例如,假设您的列表是: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

假设列表不包含重复项、任意大且尚未排序。

实现这一点的处理效率最高的算法是什么?

现在,标准方法是先简单地按升序对列表进行排序,然后从列表的末端交替剥离元素。不过,我想知道:有没有一种更省时的方法来做到这一点,而无需先对列表进行排序?

我问的原因:(仅在您关心时阅读此内容)

显然,这是我姐姐的男朋友在旧金山面试时向人们提出的问题。姐姐问了我这个问题,我马上就想出了标准答案。每个人都是这么回答的。然而,显然一个女孩想出了一个完全不同的解决方案,不需要对列表进行排序,而且它似乎有效。我姐姐无法向我解释这个解决方案,但从昨晚开始,这个想法就一直困扰着我。我会很感激任何帮助!谢谢!

【问题讨论】:

    标签: algorithm list sorting


    【解决方案1】:

    您可以在 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
    

    【讨论】:

    • 非常感谢!这么简单优雅的解决方案,让我有点不好意思没看到。我有很多东西要学...
    【解决方案2】:

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

    假设,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 个元素与第 i-1 个元素交换,第 i-2 个元素和第 i-1 个元素的顺序不会改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2020-08-10
      • 2015-05-07
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多