【问题标题】:can this sorting algorithm be considered as a variation of bubble sort?这种排序算法可以被认为是冒泡排序的变体吗?
【发布时间】:2021-10-03 18:49:58
【问题描述】:

这种方法可以被认为是冒泡排序的一种变体吗?如果不是,那么这种方法与冒泡排序的主要区别是什么?效率比较是什么?

def bubble_sort(arr):

    for i in range(len(arr)):
        for j in range(len(arr)-i):
            if arr[i] > arr[j+i]:
                arr[i], arr[j+i] = arr[j+i], arr[i]
    return arr


if __name__ == '__main__':
    arr = [21,4,1,3,9,20,25,6,21,14]
    print(bubble_sort(arr))

输出:[1、3、4、6、9、14、20、21、21、25]

【问题讨论】:

  • 对于冒泡排序实现来说,这是尽可能基本的。
  • 您的代码效率低下的一个原因是 j 从 0 开始。因此代码检查 if arr[i] > arr[0+i],这显然不是真的。

标签: python algorithm sorting bubble-sort


【解决方案1】:

您的代码实现了算法selection sort,而不是bubble sort。尽管它们有些相似:它们都基于元素交换。

对于选择排序,算法的关键是找到最小或最大元素并最后交换:

算法通过找到最小的(或最大的,取决于 按排序顺序)未排序子列表中的元素,交换 (交换)它与最左边的未排序元素(将其放入已排序 order),并将子列表边界向右移动一个元素。

您的代码可以改进以避免不必要的交换:

import random

def my_sort(arr):

    for i in range(len(arr)):
        min_idx = i
        for j in range(len(arr)-i):
            if arr[min_idx] > arr[j+i]:
                min_idx = j + i
        arr[i],arr[min_idx] = arr[min_idx], arr[i]
    return arr


if __name__ == '__main__':
    for i in range(360):
        i = i + 1
        r = random.choices(range(i * 10), k=i)   # Get list of numbers
        r1 = r.copy()
        assert my_sort(r) == sorted(r1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2021-08-17
    • 2015-09-12
    • 2016-03-19
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多