【发布时间】:2017-09-19 06:26:43
【问题描述】:
我是 Python 新手,正在学习 Python 中的数据结构。我正在尝试在 python 中实现冒泡排序算法,我做得很好,但我没有得到正确的结果。然后我找到了一些教程,在那里我看到他们首先设置了一个基本范围进行检查。
所以range在python中的语法是:
range([start], stop[, step])
而冒泡排序算法是:
def bubbleSort(alist):
for i in range(len(alist) - 1, 0, -1):
for j in range(i):
if alist[j] > alist[j+1]:
temp = alist[j]
alist[j] = alist[j+1]
alist[j+1] = temp
return alist
print(bubbleSort([5, 1, 2, 3, 9, 8, 0]))
我理解算法的所有其他逻辑,但我无法理解为什么循环从列表末尾开始一直到列表的第一个元素:
for i in range(len(alist) - 1, 0, -1):
为什么这会反向遍历列表?这个循环的主要目的是设置范围条件,为什么我们不能像这样从第一个元素遍历到len(list) - 1:
for i in range(0, len(alist) - 1, 1):
【问题讨论】:
-
这是 Python 代码,显然是由认为他们仍在编写 C 代码的人编写的(for 循环是在 C for 循环之后建模的,尽管 python for 循环更灵活)。基本上,
i索引只是跟踪列表中未排序项目的数量。我建议查看其他冒泡排序实现以获得算法的更“pythonic”视图。 -
@CharlesAddis 除了交换部分,你会在那里改变什么?
-
@poke for 循环...外循环可以是一个带有标记值
sorted的while循环...在python中实现冒泡排序的方法不止一种。请参阅此问题的第一个答案:stackoverflow.com/questions/895371/bubble-sort-homework -
@CharlesAddis nothing 与 while 循环和布尔值有关,这使得其中任何一个都更具 Python 风格。我会争辩说,while 循环是该语言中最少的 Pythonic 结构。 – 在字面上 any 其他语言中使用布尔值同样可能,但您不希望这样做的原因正是这个问题的目的:避免在大约一半的时间内迭代已经排序的列表.
-
@poke 该链接并不是为了提供我所说的“完美”实现。在 python 中实现冒泡排序有多种方法。如果您使用
enumerate,则根本不需要范围,并且在可迭代的长度上调用范围(或在可迭代上调用范围的变体)是针对 python 教条的一些最令人震惊的罪行......并且“避免在大约一半的时间内迭代已经排序的列表”......嘘。 “完全优化”的排序算法将考虑列表已经排序的情况if sorted(alist): return alist
标签: python sorting bubble-sort