为了解释为什么您的脚本现在无法正常工作,我将变量重命名unsorted
为sorted
。
首先,您的列表尚未排序。当然,我们设置sorted
为False
。
一旦开始while
循环,我们就假定该列表已经排序。想法是这样的:一旦找到两个顺序不正确的元素,便将其设置sorted
为False
。只有在没有顺序错误的元素时sorted
才会保留。True
sorted = False # We haven't started sorting yet
while not sorted:
sorted = True # Assume the list is now sorted
for element in range(0, length):
if badList[element] > badList[element + 1]:
sorted = False # We found two elements in the wrong order
hold = badList[element + 1]
badList[element + 1] = badList[element]
badList[element] = hold
# We went through the whole list. At this point, if there were no elements
# in the wrong order, sorted is still True. Otherwise, it's false, and the
# while loop executes again.
还有一些小问题,可以帮助提高代码的效率或可读性。
在for
循环中,使用变量element
。从技术上讲,element
不是元素;它是代表列表索引的数字。而且,它很长。在这些情况下,只需使用一个临时变量名即可,例如i
“ index”。
for i in range(0, length):
该range
命令还可以仅接受一个参数(名为stop
)。在这种情况下,您将获得从0到该参数的所有整数的列表。
for i in range(length):
《Python样式指南》建议使用下划线将变量命名为小写。对于这样的小脚本,这是一个很小的缺点。它会让您习惯于Python代码最常类似于的东西。
def bubble(bad_list):
要交换两个变量的值,请将它们写为元组分配。右侧被评估为元组(例如(badList[i+1], badList[i])
is (3, 5)
),然后被分配给左侧的两个变量((badList[i], badList[i+1])
)。
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
放在一起,你会得到:
my_list = [12, 5, 13, 8, 9, 65]
def bubble(bad_list):
length = len(bad_list) - 1
sorted = False
while not sorted:
sorted = True
for i in range(length):
if bad_list[i] > bad_list[i+1]:
sorted = False
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
bubble(my_list)
print my_list
(顺便说一句,我也删除了您的打印声明。)