【问题标题】:Why this is a bad bubble sort algorithm?为什么这是一个糟糕的冒泡排序算法?
【发布时间】:2017-09-02 19:19:18
【问题描述】:

我开始研究数据结构和算法,并尝试实现冒泡排序:

def BubbleSort(list):
    for a in range(len(list)): 
      for b in range(len(list)):# I could start this loop from 1
        if list[a]< list[b]:   # to avoid comparing the first element twice
          temp=list[a]
          list[a]=list[b]
          list[b]=temp
    return list

我浏览了网络和书籍 - 但没有找到冒泡排序的 Python 实现。 以上有什么问题?

【问题讨论】:

  • “没有这样的实现”是什么意思?从某种意义上说,它会以相反的方式对列表进行排序,并且它需要大约 2 倍的必要时间,而且它不是冒泡排序。
  • 我的意思是冒泡排序没有这样的实现,但正如你所说的,它不是冒泡排序。
  • I browsed the net 速读?看看Q&A@CR

标签: python algorithm python-3.x sorting


【解决方案1】:

几件事:

  1. 算法不会总是正确排序;
  2. 从句法上看,它似乎以相反的方式排序;
  3. 执行冒泡排序所需时间的两倍;
  4. 不是冒泡排序;和
  5. 最好不要在 Python 中使用名为 listdict 等的变量。

BubbeSort 通过比较两个相邻元素进行排序:所谓的“气泡”。如果检查左侧项目是否确实小于右侧项目。如果不是这种情况,它会交换元素。该算法在列表上最多迭代 n 次,之后保证排序。

所以一个非常基本的实现是:

def BubbleSort(data):
    for _ in range(len(data)):  # iterate n times
        for i in range(len(data)-1):  # i is the left index of the bubble
            if data[i+1] > data[i]:  # if the left item is greater
                # perform a swap
                temp = data[i]
                data[i] = data[i+1]
                data[i+1] = temp
    return data

现在我们可以通过在len(data)-1-j 处停止来改进算法(大约让算法在一半时间内工作),因为在每次迭代之后,气泡移动过的最右边的元素保证是最大值:

def BubbleSort(data):
    for j in range(len(data)):  # iterate n times
        for i in range(len(data)-1-j):  # i is the left index of the bubble
            if data[i+1] > data[i]:  # if the left item is greater
                # perform a swap
                temp = data[i]
                data[i] = data[i+1]
                data[i+1] = temp
    return data

但是使用冒泡排序 - 除了一些非常罕见的情况 - 效率低下。最好使用速度更快的算法,例如 QuickSortMergeSortTimSort(Python 的内置排序算法)。

【讨论】:

  • (我会这样做 1)有 一个 bubble sort [algorithm] 2)提供的代码没有实现它。)
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2020-05-24
  • 2016-03-19
相关资源
最近更新 更多