【问题标题】:Python bubblesort with list comprehension具有列表理解的 Python 冒泡排序
【发布时间】:2018-04-13 02:35:00
【问题描述】:

我是 Python 新手,我正在尝试使用冒泡排序实现算法,但使用列表理解。虽然我已经使用 if 和 for 进行列表理解,但我无法找到实现嵌套 for 以及用于排序的交换的方法。

以下是我尝试使用的代码。

import random as rn
l=[]
N=int(input('Give an integer: '))
for i in range(N):
    l.append(rn.randint(1,100))
print(l)

listset = [l[:k-1] + [l[k]] + [l[k-1]] + l[k+1:] if l[k] > l[k-1] else l for k in range(1,len(l)) ]

print(listset)

对于如何正确使用列表推导来实现冒泡排序算法,您有什么建议吗?

提前致谢。

【问题讨论】:

  • 我不认为这是一个实际的目标。大多数排序算法依赖于部分结果来实现下一步,这与列表推导并不兼容。
  • 您可以使用this 代码来帮助您指明正确的方向。
  • 您好,感谢您的回答。不幸的是,这是我正在为一门课程做的一个短期项目的要求,我们被明确要求对冒泡排序算法使用列表理解。

标签: python list list-comprehension bubble-sort


【解决方案1】:

冒泡排序基本上是将最小(升序)值冒泡到列表顶部,这是及时实现的O(n^2)

在列表理解的情况下,当我们创建新列表时,我认为精确的就地数字交换冒泡排序算法是不可能实现的。虽然通过从未排序列表n 次中选择最小(升序)数字来创建一个新列表。最终它将创建类似的算法选择排序如下-

def extractMin(numberList):
   minValue = min(numberList)
   numberList.remove(minValue)
   return minValue

import random as rn
l=[]
N=int(input('Give an integer: '))
for i in range(N):
    l.append(rn.randint(1,100))
print(l)

sorted_list = [extractMin(l) for k in range(len(l))]
print(sorted_list)

函数extractMin(..) 的时间复杂度为O(n),被调用n 次,因此整个排序的时间复杂度为O(n^2)

【讨论】:

  • 这不是冒泡排序。如果你有 3、1、4、2,那么冒泡排序的单遍将把它变成 1、3、2、4,第二遍将把它变成 1、2、3、4。这里显示的算法基本上是选择排序。
【解决方案2】:

这是一个纯粹使用列表理解执行排序的解决方案。

import itertools
s = [5, 6, 2, 4, 5, 6, 7]
new_s = s[:]
temp1 = 0
final_data = [[globals().update(temp1=s[b]), globals().update(s=s[:b]+[temp1]+s[b+1:]), globals().update(s= s[:b]+[s[b+1]]+s[b+1:])] for i in range(len(s)) for b in range(len(s)-1) if s[b+1] < s[b]]
new_final_list = list(itertools.chain.from_iterable([[a]*new_s.count(a) for a, b in itertools.groupby(s)]))

输出:

[2, 4, 5, 5, 6, 6, 7]

【讨论】:

  • 复杂的解决方案通常伴随着某种解释。
猜你喜欢
  • 2017-03-19
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多