总结常用的排序算法
主要包括冒泡排序、堆排序、归并排序、快速排序四个。
冒泡排序
冒泡排序是一种很简单的原地排序算法,在每一轮遍历都将最大的元素(或者最小)放在数组的末尾
过程为:
- 比较相邻的元素,如果第一个比第二个大,就交换它们两个
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
- 针对所有的元素重复以上的步骤,除了最后一个
- 重复步骤1~3,直到排序完成
平均时间复杂度:O(n^2)
1 | void BubbleSort(vector<int>& nums) |
堆排序
堆排序是一种原地排序算法,依赖于堆实现
过程为:
- 将原数组调整为大顶堆(或小顶堆)
- 交换堆顶与数组末尾元素,再将剩余元素调整为大顶堆
- 不断重复步骤2直到数组有序
每次调整堆的时间复杂度位O(logn),一共需要调整n次,总时间复杂度位O(nlogn)
1 | void Heapfiy(vector<int>& nums,int n,int i) |
归并排序
归并依赖于递归操作
过程为:
- 将原数组分为左右两个子数组
- 将数组递归分为左右两个子数组
- 将左右两个子数组合并有有序数组
评价时间复杂度为O(nlogn)
1 | void Merge(vector<int>& nums,int left,int mid,int right) |
快速排序
快排是最常用的排序算法之一
过程为:
- 选择一个基准值(一般为第一个或最后一个),将原数组分为两个数组
- 比基准值小的元素放在基准值左边,比基准值大的元素放在右边
- 递归调用左右两个子数组,重复上述步骤
平均时间复杂度为O(nlogn)
1 | int partition(vector<int>& nums,int left,int right) |
- 本文作者: KongXinQing
- 本文链接: https://13114987559.github.io/2024/04/29/essay/常用的排序算法/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!