返回

揭秘排序算法中的两大劲旅:选择排序与插入排序

后端



我们熟悉的冒泡排序时间复杂度为O(n²),在数据量较小时,我们可以轻松使用它,但是当数据量变大时,运行效率会极剧下降。所以,今天,我们就来看看选择排序和插入排序,这两个在时间复杂度上均为O(n²)的排序算法,它们都是如何工作的?又有哪些区别和应用场景呢?

选择排序

选择排序是一种简单易懂的排序算法,它通过不断选择未排序部分中的最小值与已排序部分最后一个元素进行交换,以此达到排序的目的。

工作原理

  1. 从未排序部分中找到最小值;
  2. 将该最小值与已排序部分最后一个元素进行交换;
  3. 重复步骤1和2,直至未排序部分为空。

举个例子,我们对数组[5, 3, 1, 2, 4]进行选择排序:

  1. 找到未排序部分([5, 3, 1, 2, 4])中的最小值1,并与已排序部分最后一个元素4交换,得到[1, 3, 5, 2, 4]。
  2. 然后,从剩下的未排序部分中找到最小值2,并与已排序部分最后一个元素5交换,得到[1, 2, 3, 5, 4]。
  3. 最后,从剩下的未排序部分中找到最小值3,并与已排序部分最后一个元素4交换,得到[1, 2, 3, 4, 5],完成排序。

特点

  • 时间复杂度:O(n²),最坏情况和平均情况均为O(n²)。
  • 空间复杂度:O(1),不需要额外的空间。
  • 稳定性:不稳定,相同元素的相对顺序可能会发生改变。
  • 比较次数:大约为(n²-n)/2次。
  • 交换次数:平均约为n/2次。

适用场景

选择排序常用于小规模数据集的排序,因为它不需要额外的空间,而且实现简单。

插入排序

插入排序也是一种简单易懂的排序算法,它通过将未排序部分的第一个元素逐个插入已排序部分的正确位置,以此达到排序的目的。

工作原理

  1. 从未排序部分中取出第一个元素;
  2. 在已排序部分中找到该元素的正确位置;
  3. 将该元素插入已排序部分的正确位置;
  4. 重复步骤1、2、3,直至未排序部分为空。

举个例子,我们对数组[5, 3, 1, 2, 4]进行插入排序:

  1. 从未排序部分中取出第一个元素5,在已排序部分中找到5的正确位置(第一个元素),并插入,得到[5]。
  2. 然后,从剩下的未排序部分中取出第一个元素3,在已排序部分中找到3的正确位置(第二个元素),并插入,得到[5, 3]。
  3. 接下来,从剩下的未排序部分中取出第一个元素1,在已排序部分中找到1的正确位置(第一个元素),并插入,得到[1, 5, 3]。
  4. 最后,从剩下的未排序部分中取出第一个元素2,在已排序部分中找到2的正确位置(第二个元素),并插入,得到[1, 2, 5, 3]。
  5. 最后,从剩下的未排序部分中取出最后一个元素4,在已排序部分中找到4的正确位置(第三个元素),并插入,得到[1, 2, 3, 4, 5],完成排序。

特点

  • 时间复杂度:O(n²),最坏情况和平均情况均为O(n²)。
  • 空间复杂度:O(1),不需要额外的空间。
  • 稳定性:稳定,相同元素的相对顺序不会发生改变。
  • 比较次数:大约为(n²-n)/2次。
  • 交换次数:平均约为n/2次。

适用场景

插入排序常用于小规模数据集的排序,因为它不需要额外的空间,而且实现简单。同时,插入排序也常用于对已经基本有序的数据进行排序,因为它的时间复杂度与数据的有序程度相关,有序程度越高,时间复杂度越低。