常见的排序思路

1,548 阅读4分钟

排序思路

冒泡排序的思路如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们的位置。
  2. 对每一对相邻的元素做相同的工作,从开始的第一对到结尾的最后一对。这步完成后,最后的元素应该是数组中最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上述步骤,直到没有任何一对数字需要比对。

冒泡排序是一种简单但效率比较低的排序算法,时间复杂度为 O(n²),在处理数据规模较小的数据时,其表现比较出色。但是,在实际开发中,基于效率的考虑,更多地采用其他算法进行排序。

插入排序的思路如下:

  1. 从第一个元素开始,该元素可以认为已经被排序。
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描。
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置。
  4. 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置。
  5. 将新元素插入到该位置后。
  6. 重复步骤 2~5,直到排序完成。

插入排序相比较冒泡排序、选择排序时间复杂度有些高,但空间复杂度低,且对于基本有序数组,表现优异。在实际开发中,也确实因为其实现简单、适用性强而得到广泛使用。

选择排序的思路如下:

  1. 初始状态:无序区为整个数列,有序区为空。
  2. 在无序区中遍历,找到最小的元素,然后将其放到有序区的末尾。
  3. 重复步骤 2,直到整个数列排序完成。

选择排序的时间复杂度为O(n²),相对于其他排序算法而言效率较低,在处理大规模数据时表现较差,但其实现简单、代码易于理解,在实际开发中广泛使用。

归并排序的思路如下:

  1. 分割阶段: 将待排序的数列分成两部分,递归地对左右两部分进行归并排序。
  2. 归并阶段: 将两个已经排序好的子序列合并成一个最终的排序序列。

归并排序的时间复杂度为O(n*logn),相比较冒泡排序、选择排序、插入排序时间复杂度有了较大的提升,在大规模数据上表现较为出色,在实际开发中使用情况较多。

快速排序的思路如下:

  1. 选择一个基准元素: 从数列中选取一个元素作为基准元素(通常选择第一个元素或最后一个元素)。
  2. 分割操作: 将数列中所有小于基准元素的元素放到左边,所有大于基准元素的元素放到右边,等于基准元素的元素放到中间。
  3. 递归排序: 对左右两个分区重复步骤1和步骤2,直到各区间只有一个数为止。

快速排序相比较冒泡排序和选择排序具有时间复杂度低、原址性高的优点,在大规模数据上表现比较出色,但在实际开发中需要注意,快速排序的时间复杂度也存在一定的极值情况。

堆排序的思路如下:

  1. 建立最大堆: 将待排序数组转化为最大堆。最大堆是一种特殊的二叉树,即每个节点都大于等于其左右儿子节点,而且是一颗完全二叉树。
  2. 将堆顶元素取出并放入已排序区间末尾:将堆顶元素(即最大值)取出并放入已排序区间的末尾。
  3. 调整堆:将剩下的元素重新调整为最大堆。重复步骤2和步骤3,直到所有元素都已经排序完毕。

堆排序算法对原始数据在堆上进行排序,相比较其他排序算法具有时间复杂度低、适应性强、稳定性低的优点,在实际开发中,使用情况较多。