Algorithm 将数字列表按交替的高低顺序排序最有效的方法是什么?
假设给您一个未排序的正整数列表,并且您希望按如下方式对其排序:元素交替为:(小于前一个元素),(大于前一个元素),(小于前一个元素),等等。。。输出列表中的第一个元素可能会忽略该规则。例如,假设您的列表是: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)中执行此操作 比如说,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
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