Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将数字列表按交替的高低顺序排序最有效的方法是什么?_Algorithm_List_Sorting - Fatal编程技术网

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

Algorithm 将数字列表按交替的高低顺序排序最有效的方法是什么?,algorithm,list,sorting,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 假设列表不包含重复项、任意大且尚未排序 实现这一点最有效的算法是什么? 现在,标准的方法是先简单地按升序对列表进行排序,然后交替地从列表的末尾剥离

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

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

实现这一点最有效的算法是什么? 现在,标准的方法是先简单地按升序对列表进行排序,然后交替地从列表的末尾剥离元素。然而,我想知道:有没有一种更省时的方法,不用先对列表排序就可以做到这一点

我提问的理由:(只有在你在乎的时候才读)

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

通过将每个元素依次放置在末尾,或根据与当前最后一个元素的比较,将每个元素放置在倒数第二个位置,可以在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] 
1,4,9,2,7,5,3,8,6
将1放在末尾,当前列表[1]
4> 1正确,因此将4置于当前列表的末尾[1,4]
94错误,因此倒数第2位[1,9,2,4]
74正确,因此将5放在末尾[1,9,2,7,4,5]
33正确,因此将8放在末尾[1,9,2,7,4,5,3,8]

6B[-1])或(i&1==0和a一个解是这样的。用伪代码给出

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

nums=[数字列表]
如果nums[0]nums[i-1]:
交换(nums[i],nums[i-1])
最后状态=减少
其他的
如果nums[i]
正确性证明:

在每次循环迭代之后,NUM中索引
i
的元素保持交替,最后的_状态表示
i
th和
i-1
th元素的顺序


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

非常感谢!这样一个简单而优雅的解决方案让我有点不好意思没有看到它。我有很多东西要学。。。
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
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