排序算法是学习算法中最核心的启蒙内容

总得来说,排序算法可以有

  • O(n2)O(n^2) 的冒泡排序
  • O(nlogn)O(n \log n) 的快速排序,归并排序,堆排序
  • O(n)O(n) 的计数排序,基数排序,桶排序

没有哪种排序算法是绝对最优的,选择哪种排序算法取决于具体的应用场景和数据特征

# 冒泡排序 Bubble Sort

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行直到没有再需要交换,也就是说该数列已经排序完成
冒泡排序的时间复杂度为 O(n2)O(n^2),空间复杂度为 O(1)O(1),是一种稳定的排序算法

# 快速排序 Quick Sort

快速排序是一种分治算法,它通过一个基准元素将数组分成两部分,一部分比基准元素小,另一部分比基准元素大,然后递归地对这两部分进行排序
快速排序的平均时间复杂度为 O(nlogn)O(n \log n),最坏情况下时间复杂度为 O(n2)O(n^2)(当输入数组已经有序或者逆序时),空间复杂度为 O(logn)O(\log n),是一种不稳定的排序算法

# 归并排序 Merge Sort

归并排序也是一种分治算法,它将数组分成两半,递归地对每一半进行排序,然后将两个已排序的半数组合并成一个有序的数组
归并排序的时间复杂度为 O(nlogn)O(n \log n),空间复杂度为 O(n)O(n),是一种稳定的排序算法

# 堆排序 Heap Sort

堆排序是一种基于堆数据结构的排序算法,它首先将数组构建成一个最大堆,然后将堆顶元素(最大元素)与数组的最后一个元素交换位置,并将剩余的元素重新调整为最大堆,重复这个过程直到堆中只剩下一个元素
堆排序的时间复杂度为 O(nlogn)O(n \log n),空间复杂度为 O(1)O(1),是一种不稳定的排序算法

# 计数排序 Counting Sort

计数排序是一种非比较排序算法,它通过统计输入数据中每个元素出现的次数来确定每个元素在输出数组中的位置
计数排序的时间复杂度为 O(n+k)O(n + k),其中 nn 是输入数组的大小,kk 是输入数据的范围,空间复杂度为 O(n+k)O(n + k),是一种稳定的排序算法

# 基数排序 Radix Sort

基数排序是一种非比较排序算法,它通过将整数按位分割成不同的数字,然后按每个位数分别进行排序来实现排序
基数排序的时间复杂度为 O(nk)O(n \cdot k),其中 nn 是输入数组的大小,kk 是数字的位数,空间复杂度为 O(n+k)O(n + k),是一种稳定的排序算法

# 桶排序 Bucket Sort

桶排序是一种分布式排序算法,它将输入数据分到几个桶中,每个桶内使用其他排序算法(如插入排序)进行排序,最后将各个桶中的数据合并起来得到有序的结果
桶排序的时间复杂度为 O(n+k)O(n + k),其中 nn 是输入数组的大小,kk 是桶的数量,空间复杂度为 O(n+k)O(n + k),是一种稳定的排序算法