📜  插入排序和选择排序之间的区别(1)

📅  最后修改于: 2023-12-03 15:39:51.712000             🧑  作者: Mango

插入排序和选择排序之间的区别

插入排序和选择排序是两种简单的排序算法,它们有许多相似之处,但也有一些重要的区别。

算法思想
  • 插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
  • 选择排序:将数据分为已排序和未排序两部分,每次从未排序的数据中选择最小值,插入已排序部分的末尾。
时间复杂度
  • 插入排序:最好情况下,时间复杂度为O(n),最坏情况下,时间复杂度为O(n^2)。平均情况下,时间复杂度为O(n^2)。
  • 选择排序:无论最好、最坏、平均情况,时间复杂度都为O(n^2)。
空间复杂度
  • 插入排序:空间复杂度为O(1),不需要额外空间。
  • 选择排序:空间复杂度为O(1),不需要额外空间。
稳定性
  • 插入排序:是一种稳定的排序算法,在排序过程中,相同元素的相对位置不会发生改变。
  • 选择排序:是一种不稳定的排序算法,在排序过程中,相同元素的相对位置可能会发生改变。
实现方式

插入排序和选择排序的实现方式也有一些不同。

  • 插入排序:通常使用两层嵌套循环。外层循环从第二个元素开始,到最后一个元素结束,内层循环从当前元素开始,向前遍历已排好序的序列,找到插入的位置。
def insertion_sort(arr):
    for i in range(1, len(arr)):
        j = i - 1
        key = arr[i]
        while j >= 0 and arr[j] > key:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key
    return arr
  • 选择排序:通常使用一层嵌套循环。外层循环从第一个元素开始,到倒数第二个元素结束,内层循环从当前元素的下一个元素开始,找到最小值的位置。
def selection_sort(arr):
    for i in range(len(arr) - 1):
        min_index = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[min_index], arr[i] = arr[i], arr[min_index]
    return arr

因为插入排序的时间复杂度比选择排序低,而且插入排序是一种稳定的排序算法,所以插入排序的使用场景比选择排序更广泛。但对于小规模数据的排序,选择排序确实比插入排序快一些。