【问题标题】:Issue with bubblesort not sorting last number冒泡排序的问题没有对最后一个数字进行排序
【发布时间】:2021-05-03 16:38:13
【问题描述】:

编码和算法的新手。尝试最简单的一种,冒泡排序。但似乎最后一个数字没有被排序?实在想不通为什么。

原始列表如下所示 - list = [4, 5, 3, 10, 17, 6, 2, 22, 76, 99, 18, 7] 但我的输出看起来像这样 - [99, 2, 3, 4, 5, 6, 7, 10, 17, 18, 22, 76]

由于某种原因,99 没有被换到后面,我无法确定原因。

list = [4, 5, 3, 10, 17, 6, 2, 22, 76, 99, 18, 7]

def bblSort(list):
    for i in range(len(list)):
        print(list[i])
        for j in range(len(list) - 1):
            if list[i] <list[j+1]:
                list[i], list[j+1] = list[j+1], list[i]

    print(list)

【问题讨论】:

  • 这不是冒泡排序——冒泡排序只比较相邻项。
  • 更改range(len(list) - 1) - > range(len(list)-i - 1)if list[i] &lt;list[j+1]:if list[i] &gt;list[j+1]:list[i], list[j+1] = list[j+1], list[i]list[j], list[j+1] = list[j+1], list[j]

标签: python python-3.x algorithm sorting


【解决方案1】:

您只需要一个循环,因为冒泡排序会比较相邻的值。尝试用 i 做一个循环,然后只比较 list[i] 和 list[i+1](注意列表末尾)

顺便说一句,最好不要使用类型名称调用变量,这里为变量“列表”选择另一个名称。

【讨论】:

  • 朋友,我试试看
  • 如果一个项目需要在列表中向后移动几个位置怎么办?单个循环只会将该项目向后交换一个位置。
  • 更适合作为评论,而不是答案
【解决方案2】:

对于冒泡排序,您需要多次遍历列表以确保它已排序。每次通过都保证将最大的数字移动到正在排序的列表部分的末尾。这意味着您不需要再次排序该位置,因此您只需在下一次遍历时排序到该位置。

我对 Python 了解不多,所以这是伪代码。它按升序对列表进行就地排序。

bubblesort(list myList)
  for (hi <- myList.length - 1 downto 0) do
    for (lo <- 1 to hi) do
      if (myList[lo - 1] > myList[lo]) then
        swap(myList[lo - 1], myList[lo]) 
      endif
    endfor
  endfor
end bubblesort()

每次传递都会对列表中从开始到 hi 之间的部分进行排序,而 hi 每次传递都会减少一个。

如果传球没有进行任何交换,请想办法提前完成。在这种情况下,列表已经按顺序排序。

【讨论】:

    【解决方案3】:

    如果您的目标是实现冒泡排序,您的代码有几个问题:

    • 冒泡排序只比较和交换相邻元素,所以比较lst[j]lst[j+1]
    • 然后应该相应地调整比较,以适应 lst[j] &gt; lst[j+1],这表明这两个值出现的顺序错误。
    • 虽然不是绝对需要让它工作,但一个好的冒泡排序算法不会验证肯定已经处于正确顺序的对。这意味着每次i 递增时,内部循环确实需要减少一次迭代,因为列表的末尾将包含已经排序的(增长的)部分。

    所以:

    def bblSort(lst):
        for i in range(len(lst)):
            for j in range(len(lst) - 1 - i):
                if lst[j] > lst[j+1]:
                    lst[j], lst[j+1] = lst[j+1], lst[j]
    

    【讨论】:

      【解决方案4】:

      冒泡排序可以用两个 for 循环或一个 while 循环和一个 for 循环来实现。这是一个使用 while 和 for 循环的实现,更容易理解。

      此函数使用内部 for 循环遍历列表,将每个对象与其后面的对象进行比较,并在必要时交换两者。外部 while 循环确保它在整个列表中一遍又一遍地重复 for 循环,直到不再需要交换为止。

      def bubble_sort(unsorted_list):
          my_list = list(unsorted_list) # create a copy to avoid mutating the original list
          unsorted = True
          while unsorted:
              unsorted = False
              for i in range (len(my_list)-1):
                  if my_list[i] > my_list[i+1]:
                      unsorted = True
                      my_list[i] , my_list[i+1] = my_list[i+1], my_list[i]
          return my_list
      
      unsorted_list = [5,2,4,90,140,23,554,32,98,12,15,0,43,-34,10]
      print(bubble_sort(unsorted_list))
      

      打印: [-34, 0, 2, 4, 5, 10, 12, 15, 23, 32, 43, 90, 98, 140, 554]

      【讨论】:

        猜你喜欢
        • 2011-12-16
        • 2020-05-24
        • 1970-01-01
        • 2012-11-03
        • 2021-12-15
        • 2012-03-01
        • 2020-12-19
        • 1970-01-01
        相关资源
        最近更新 更多