【问题标题】:Bubble Sort following an algorithm冒泡排序遵循算法
【发布时间】:2015-01-17 11:08:58
【问题描述】:

我正在尝试在 python 中使用算法实现冒泡排序代码:
我设法使用 double for 编写了一个代码,它工作正常。

A=[43,21,12,80,3,2,35]
lengthOfList = len(A)
for i in range (lengthOfList):
    for k in range(lengthOfList-1, i,-1 ):
        if ( A[k - 1]> A[k]):
            temp = A[k]
            A[k] = A[k-1]
            A[k-1] = temp
print A

我现在尝试采用这个算法的登录超过 3 个小时,但是我无法让它工作:

procedure bubbleSort( A : list of sortable items )
   n = length(A)
   repeat 
     swapped = false
     for i = 1 to n-1 inclusive do
       #if this pair is out of order
       if A[i-1] > A[i] then
         # swap them and remember something changed
         swap( A[i-1], A[i] )
         swapped = true
       end if
     end for
   until not swapped
end procedure

我有点卡在重复和直到阶段。我知道我必须使用 while,但我无法理解如何使用 while 来实现它

【问题讨论】:

  • Bubble Sort Homework的可能重复
  • 结果显然是一样的,但是这些代码没有遵循我要求的算法。我在发帖之前已经检查过了。
  • while swapped替换for i in range (lengthOfList):,在swap部分设置为true,在每次迭代时重置
  • 要准确复制您发布的算法,您需要一个do-while 循环,即not directly available in Python
  • 如果来自维基页面,则基于pastebin.com/g3PMXSJA

标签: python algorithm


【解决方案1】:

您没有正确改编维基百科的代码;

procedure bubbleSort( A : list of sortable items )
    n = length(A)
    repeat
       swapped = false
       for i = 1 to n-1 inclusive do
          if A[i-1] > A[i] then
             swap(A[i-1], A[i])
             swapped = true
          end if
       end for
       n = n - 1
    until not swapped
end procedure

jsut和上面的版本一样吗,只是它利用了每次运行后,最后一个X条目保证被排序的事实。

这样设想可能更容易:

procedure bubbleSort(someList):
  while someList is not sorted:
    loop over all elements in the list:
      if the current item is larger than the next item:
        swap items

冒泡排序基本上是反复扫描列表,如果它们相对无序,则交换任意两个元素。你只需要这样做。

唯一比较棘手的部分是“当 someList 未排序时”;有两种方法可以解决这个问题。一种方法是编写一个函数来简单地告诉您列表是否已排序,您可以非常简单地这样做:

def isListSorted(l):
  for i in range(len(l)-1):
    if l[i] > l[i+1]: return False

  return True

或者,您知道,如果它设法在不交换任何元素的情况下遍历整个列表,则会对其进行排序,因此您可以使用flag 来跟踪它;

def bubbleSort(l):
  isSorted = False
  while not isSorted:
    isSorted = True
    for i in range(len(l)-1):
      if l[i] > l[i+1]:
        isSorted = False
        l[i], l[i+1] = l[i+1], l[i]

或者,如果你想使用上面提到的功能;

def bubbleSort2(l):
  while not isListSorted(l):
    for i in range(len(l)-1):
      if l[i] > l[i+1]:
        l[i], l[i+1] = l[i+1], l[i]

并不是说第一个解决方案更快,因为它不会在每个循环开始时遍历整个列表以检查它是否已排序,但这与优化无关,因为您正在查看冒泡排序。

如果您还在为添加页面上提到的优化而烦恼;这是一项简单的任务;

def bubbleSort(l):
  isSorted = False
  n = len(l)-1
  while not isSorted:
    isSorted = True
    for i in range(n):
      if l[i] > l[i+1]:
        isSorted = False
        l[i], l[i+1] = l[i+1], l[i]
    n-=1


def bubbleSort2(l):
  n = len(l)-1
  while not isListSorted(l):
    for i in range(n):
      if l[i] > l[i+1]:
        l[i], l[i+1] = l[i+1], l[i]
    n-=1

【讨论】:

  • 谢谢威尔。我现在明白你的意思了。这正是我想要做的!
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2013-11-02
  • 2016-11-01
  • 2013-03-08
  • 2021-03-24
  • 2018-02-08
相关资源
最近更新 更多