【发布时间】:2019-12-12 11:48:56
【问题描述】:
我想看看是否可以转换一个BubbleSort函数,例如:
def BubbleSort(l):
for i in range(len(l)-1):
for j in range(len(l)-1-i):
if (l[j]>l[j+1]):
l[j],l[j+1]=l[j+1],l[j]
return l
到单行列表理解,可能类似于:
def BubbleSort(l):
return [something_goes_here for i in range(len(l)-1) for j in range(len(l)-1-i) if (l[j]>l[j+1])]
示例输入:
print(BubbleSort([1,5,-5,0,10,100]))
样本输出
[-5, 0, 1, 5, 10, 100]
【问题讨论】:
-
好吧,既然您使用 nested
for循环,您的列表将包含 n^2+n/2(平均而言,过滤将保留这些值的特定部分),因此它不会打印这样的列表(不幸的是 Python 并没有真正实现列表单子,因为这样会更容易)。 -
@ScotHunter:这是正确的,但如果我们像使用冒泡排序一样迭代列表,最终它会归结为“交换”的数量。最坏的情况,冒泡排序不仅需要 O(n^2) 比较,而且还需要 O(n^2) 交换(交换列表需要这样)。
-
我们可以将选择排序转换为等效的“列表理解”,尽管这也会效率低下。
-
我们还要强调一下,列表推导旨在创建新列表,这对他们来说不是一个好的用例,只是为了强调您可能已经知道的内容,但是有人带着新的一对来回答这个问题眼睛可能不会。
-
@ParitoshSingh:正确,它至少需要一些有副作用的东西。即使有可能,从软件设计的角度来看也不好。
标签: python python-3.x algorithm sorting bubble-sort