泡泡排序家庭作业

问题:

在课堂上,我们正在进行排序算法,虽然我们在谈论它们并编写伪代码时了解它们,但我在为他们编写实际代码时遇到了问题。
这是我在Python中的尝试:

mylist = [12, 5, 13, 8, 9, 65]

def bubble(badList):
    length = len(badList) - 1
    unsorted = True

    while unsorted:
        for element in range(0,length):
            unsorted = False
            if badList[element] > badList[element + 1]:
                hold = badList[element + 1]
                badList[element + 1] = badList[element]
                badList[element] = hold
                print badList
            else:
                unsorted = True

print bubble(mylist)

现在,这个(据我所知)可以正确排列,但一旦完成,它就会无限期地循环。
该代码如何修复,以便函数完成并正确排序任何(合理)大小的列表?
附:我知道我不应该在一个函数中真的有打印,我应该有一个返回,但是我还没有这样做,因为我的代码没有真正的工作。

回答:

为了解释为什么你的脚本现在不起作用,我将重命名变量unsortedsorted
首先,您的列表尚未排序。当然,我们将sorted设置为False
一旦我们开始while循环,我们假设列表已经被排序了。这个想法是:一旦找到两个不正确的元素,我们将sorted设置回Falsesorted将保留True only if there were no elements in the wrong order

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 Style Guide建议将变量以小写命名为下划线。这是一个非常小的nitpick一个这样的小脚本;更多的是让您习惯于最常见的Python代码。 def(bad_list):
  • 要交换两个变量的值,将它们写为元组赋值。右侧被评估为一个元组(例如,(badList[i+1], badList[i])(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

(我也删除了你的打印声明,顺便说一句。)

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Bubble Sort Homework

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

94 − = 87