【问题标题】:Why do I need two loops for bubble sort?为什么冒泡排序需要两个循环?
【发布时间】:2022-01-05 08:26:26
【问题描述】:

我是编程初学者,我的问题是: 为什么我需要 2 个“for 循环”才能工作? 感谢您提前提供任何答案^^

# Bubble sort

a = [2092, 8966, 564331, 989]
laenge = len(a)

for i in range(1,laenge):
    for j in range(0,laenge-i):
        if a[j] > a[j+1]:
            tempdata = a[j]
            a[j] = a[j+1]
            a[j+1] = tempdata
        
print (a)

print (" Surprise monkey")

【问题讨论】:

  • 因为冒泡排序算法就是这样工作的,所以您必须对列表执行多次遍历。您可能想阅读:en.wikipedia.org/wiki/Bubble_sort
  • 每个内部循环完成都会使下一个最大元素“浮动”到它的位置(因此是算法名称)。您需要为每个元素重复它。
  • 因为这是一种非常低效的排序方式。

标签: python bubble-sort


【解决方案1】:

冒泡排序的工作方式是每次通过列表后,它保证将下一个最大的元素推到列表的末尾(https://www.youtube.com/watch?v=JP5KkzdUEYI)。

因此,一旦我们使用循环(内循环)来交换每对无序的元素,就可以通过列表。在对最后一个元素进行排序后执行此操作后,对最后两个元素进行两次排序,等等。因此,要对列表进行完全排序,我们需要遍历数据 n 次,其中 n 是元素的数量(外循环)。

这个嵌套循环是为什么冒泡排序是 O(n^2) 并且不是首选排序算法的原因

a = [2092, 8966, 564331, 989] 
laenge = len(a)

for i in range(1,laenge): # run inner loop n times to sort all elements
    for j in range(0,laenge-i): # completing this loop will sort the last unsorted element
        if a[j] > a[j+1]:
            tempdata = a[j]
            a[j] = a[j+1]
            a[j+1] = tempdata
    

【讨论】:

    【解决方案2】:

    可以在单个循环中执行,但您仍然需要两个控制变量来管理数据的多次传递。考虑到最后一个位置将按排序顺序获得其适当的元素,可以通过将范围缩短 1 来优化每个通道。只要一次没有交换,整个循环就可以停止。

    基本形式:

    a = [2092, 8966, 564331, 989]
    
    i,j = 1,len(a)-1
    while j:
        if i>j: i,j = 1,j-1           # new pass 
        if a[i-1]>a[i]:
            a[i-1],a[i] = a[i],a[i-1] # preform swap
        i += 1                        # next swap index
    
    print(a)
    [989, 2092, 8966, 564331] 
    

    使用交换检测优化:

    a = [2092, 8966, 564331, 989]
        
    last    = len(a)  # sorted positions from last to 1st
    i       = last+1  # current swapping index
    swapped = True    # swap detection
    while last:
        if i>last:    # pass complete, reset indexes
            if not swapped: break # done if no swaps made
            last -= 1             # last is sorted
            i,swapped = 1,False   # start new pass
        if a[i-1]>a[i]:
            a[i-1],a[i] = a[i],a[i-1] # preform swap
            swapped = True
        i += 1                    # next swap index
        
    print(a)
    [989, 2092, 8966, 564331] 
    

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2015-10-18
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多