下面都是将整数数组排序为升序
冒泡排序(Bubble Sort)
通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。
选择排序(Selection Sort)
从未排序区间查找最小的元素,将其放到已排序区间的末尾。
插入排序(Insertion Sort)
逐个将元素插入已排序部分,形成新的有序列表。
快速排序(Quick Sort)
选择一个基准元素,将列表分为两个子列表,小于基准的放在左边,大于基准的放在右边,然后对两个子列表递归地应用相同的方法。
三路快排
归并排序(Merge Sort)
一种基于分治策略的排序算法:
- 划分阶段:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题。
- 合并阶段:当子数组长度为 1 时终止划分,开始合并,持续地将左右两个较短的有序数组合并为一个较长的有序数组,直至结束。
堆排序(Heap Sort)
利用堆数据结构,将列表转换为最大堆(最小堆),然后每次从堆顶取出最大(最小)元素,重新调整堆结构。
前述几种排序算法都属于“基于比较的排序算法”,它们通过比较元素间的大小来实现排序,此类排序算法的时间复杂度无法超越 O(nlogn)。下面几种“非比较排序算法”,它们的时间复杂度可以在理想情况下达到线性阶。
桶排序(Bucket Sort)
它通过设置一些具有大小顺序的桶,每个桶对应一个数据范围,将数据分配到各个桶中;然后在每个桶内部分别执行排序(语言自带的排序方法);最终按照桶的顺序将所有数据合并。
桶排序适用于处理体量很大的数据。
桶排序的时间复杂度理论上可以达到 O(n),关键在于将元素均匀分配到各个桶中,因为实际数据往往不是均匀分布的。
计数排序(Counting Sort)
统计每个元素的出现次数,然后按照统计信息重建排序后的列表。
适用于数据量大但数据范围较小的整数数组。
基数排序(Radix Sort)
核心思想与计数排序一致,也通过统计个数来实现排序。在此基础上,基数排序利用数字各位之间的递进关系,依次对每一位进行排序,从而得到最终的排序结果。
适用于数值范围较大的情况,但前提是数据必须可以表示为固定位数的格式,且位数不能过大。