冒泡按照算法排序

时间:2014-11-19 19:21:31

标签: python algorithm

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

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

来实现它

1 个答案:

答案 0 :(得分:3)

您没有正确调整维基百科中的代码;

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没有排序&#34 ;;有两种方法可以解决这个问题。一种方法是编写一个函数,只是告诉你列表是否已经排序,你可以这样做:

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