【发布时间】:2012-07-05 10:09:56
【问题描述】:
我正在尝试将数组中的偶数移动到数组的前面,将奇数移动到数组的后面。问题要求在线性算法中执行此操作并就地执行此操作。
我想出了这个:
def sort(a):
for i in range(0,len(a)-1):
if a[i]%2==0:
a.insert(0,a.pop(i))
return a
问题是,有人告诉我,从技术上讲,a.insert 是一个 o(n) 函数,所以从技术上讲,这将被视为非线性算法(当包括函数的 for i in range 部分时)。由于提出这个问题的论坛已有几个月的历史,我无法要求解释。
基本上,我相信他说的是“技术上”,因为由于这会将其插入到前面,因此它不会检查数组中的另外 N 个元素,因此使其在 O(n) 而不是 O(n ^2)。这是一个正确的评估吗?
另外,论坛上有人用a.append修改了上面的,改成找奇数。没有人回答,所以我想知道, a.append 不是 o(n) 函数,因为它将它移动到最后吗?是o(1)吗?
感谢您的解释和澄清!
【问题讨论】:
-
O(n) 是 linear
-
糟糕。抱歉,我的意思是当您还考虑
for i in range我已经编辑了我的问题时,它不是线性的。 -
lst = [i for i in lst if not i % 2] + [i for i in lst if i % 2]