【问题标题】:Efficiency of Selection Sort vs. Insertion Sort选择排序与插入排序的效率
【发布时间】:2013-04-19 07:02:02
【问题描述】:

我目前正在尝试在 python 中实现插入排序和选择排序。我的两个实现都有效。但是,当我对排序进行计时时,选择排序的执行速度始终比插入排序快 1.5 倍,尽管我的插入排序实现的比较次数大约是我的选择排序实现的一半。我似乎找不到原因。

def select_sort(data):
    for i in range(len(data)):
        minimum, index = None, i
        for j in range(i, len(data)):
            if minimum is None:
                minimum = data[j]
            if data[j] < minimum:
                minimum = data[j]
                index = j
        data[i], data[index] = data[index], data[i]
    return data

def insert_sort(data):
    for i in range(1, len(data)):
        for j in range(i, 0, -1):
            if data[j] >= data[j - 1]:
                break
            data[j], data[j - 1] = data[j - 1], data[j]
    return data

def time_sort(S):
    elapsed = []

    start = time()
    insert_sort(copy(S))
    elapsed.append(time() - start)

    start = time()
    select_sort(copy(S))
    elapsed.append(time() - start)

    return elapsed

【问题讨论】:

  • 使用xrange 代替range 会有所帮助,因为range 会实例化一个新列表。您还可以将len(sort) 存储在一个变量中,以减少函数调用。
  • 是的,但我认为我的两种算法都使用 range 或多或少相同的次数。
  • 您尝试排序的数据集可能会有所不同。您是否在多个数据集上尝试过此操作?
  • Nathan 可能为您指明了正确的方向。插入排序在部分有序数据上表现良好。
  • 是的。我有一段代码生成 100 个介于 0 和 1 之间的随机数并对其执行 time_sort,然后对 1000 次不同试验的结果进行平均。不过我会尝试使用 xrange 看看我是否有运气。

标签: python sorting time-complexity


【解决方案1】:

insert_sort 进行 O(N2) 次交换,而 select_sort 进行 N 次交换。

交换在select_sort 的外循环中,但在insert_sort 的内循环中。

【讨论】:

  • 如何减少插入排序中的交换次数?我不想使用 python 的 insert() 方法,因为它是 O(n)。
  • 这就是插入排序的方式——它对数组进行 O(N×N) 次写入。如果你对它进行了足够的改进,最终你会得到一个归并排序、堆排序或外壳排序。以here 为例。
  • 我没有将值交换到适当的位置,而是尝试移动所有其他值,然后将值放在“空白”空间中。不知道为什么,但是有了这个实现,它比我的选择排序更快。感谢您的帮助!
  • 当你增加输入的大小时会发生什么?
  • 当我增加输入的大小时,最终选择排序再次变得更有效率。知道为什么会这样吗?
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 2013-03-25
  • 2023-03-20
  • 2016-05-28
  • 2018-10-29
  • 2019-05-10
  • 2015-04-25
  • 1970-01-01
相关资源
最近更新 更多