返回

排序算法那些事儿

闲谈

排序算法的分类

排序算法可以根据其时间复杂度和空间复杂度分为以下几类:

O(n^2):

  • 选择排序:选择排序是通过不断地从未排序序列中选择最小的元素,并将其放在已排序序列的末尾,直到所有元素都已排序。选择排序的时间复杂度为O(n^2)。
  • 冒泡排序:冒泡排序是通过不断地比较相邻元素,并交换顺序不正确的元素,直到所有元素都已排序。冒泡排序的时间复杂度为O(n^2)。
  • 插入排序:插入排序是通过不断地将未排序序列的第一个元素插入到已排序序列的正确位置,直到所有元素都已排序。插入排序的时间复杂度为O(n^2)。

O(nlogn):

  • 快速排序:快速排序是通过不断地将序列划分为两个子序列,并递归地对子序列进行排序,直到所有元素都已排序。快速排序的时间复杂度为O(nlogn)。
  • 归并排序:归并排序是通过不断地将序列划分为两个子序列,并对子序列进行排序,然后将两个已排序的子序列合并为一个已排序的序列,直到所有元素都已排序。归并排序的时间复杂度为O(nlogn)。
  • 希尔排序:希尔排序是通过将序列划分为多个子序列,并对子序列进行排序,然后将子序列合并为一个已排序的序列,直到所有元素都已排序。希尔排序的时间复杂度为O(nlogn)。
  • 堆排序:堆排序是通过将序列构建成一个堆,并不断地从堆中取出最大的元素,直到所有元素都已排序。堆排序的时间复杂度为O(nlogn)。

O(n):

  • 桶排序:桶排序是通过将序列划分为多个桶,并将元素放入相应的桶中,然后对每个桶中的元素进行排序,最后将各个桶中的元素合并为一个已排序的序列。桶排序的时间复杂度为O(n)。
  • 计数排序:计数排序是通过计算序列中每个元素的出现次数,然后根据出现次数对元素进行排序。计数排序的时间复杂度为O(n)。
  • 基数排序:基数排序是通过将序列中的元素按位排序,从最低位到最高位,直到所有元素都已排序。基数排序的时间复杂度为O(n)。

排序算法的比较

每种排序算法都有其优缺点,适合不同的应用场景。下表对几种常见的排序算法进行了比较:

算法 时间复杂度 空间复杂度 稳定性 适用范围
选择排序 O(n^2) O(1) 不稳定 小规模数据
冒泡排序 O(n^2) O(1) 不稳定 小规模数据
插入排序 O(n^2) O(1) 稳定 小规模数据
快速排序 O(nlogn) O(logn) 不稳定 大规模数据
归并排序 O(nlogn) O(n) 稳定 大规模数据
希尔排序 O(nlogn) O(1) 不稳定 中等规模数据
堆排序 O(nlogn) O(1) 不稳定 中等规模数据
桶排序 O(n) O(n) 稳定 元素分布均匀的数据
计数排序 O(n) O(n) 稳定 元素范围较小的数据
基数排序 O(n) O(n) 稳定 元素范围较大且分布均匀的数据

总结

排序算法是计算机科学中的一个重要课题,它广泛应用于各个领域。不同的排序算法有其不同的优缺点,适合不同的应用场景。在选择排序算法时,需要考虑数据量、数据分布、稳定性等因素。