排序算法总结
排序算法是最常见的一种算法,生活中比较常见的实现方式有快速排序和归并排序。
归并排序
归并排序就是先把左半边数组排好序,再把右半边的数组排好序,然后进行将两侧的数组进行合并。
- 伪代码框架
理解上来说,归并排序就像是二叉树的中序遍历,排序算法很容易和二叉树联系起来。
1 | def sort(nums, left, right): |
- python 实现
1 | from typing import List |
如图所示
归并排序的时间复杂度是非常好的 $O(NlogN)$ ,而且不存在极端情况,分治的思想在算法中也是经常用到。
快速排序
快速排序的标准实现有两种:
- 使用最后一个元素 r 作为 povit
基本过程可以参考《算法导论》上的介绍
1 | class Solution: |
- 使用第一个元素作为 pivot
1 | class Solution: |
悲剧的是,这两种快排实现都不能满足912. 排序数组的耗时要求…..
第 k 大的元素
对于第 k 大的元素,可以理解为从大到小排序中的第 k -1 的元素
或者从小到大排序中的第 n - k 的元素。
1 | from typing import List |
partition 返回的位置 pos ,我们都知道其左边数组均小于 nums[pos],右边数组均大于 nums[pos] 。
对比 pos 与 k 的大小:
- 如果 pos < k : 说明第 k 个位置上的元素,在 pos 的右侧;
- 如果 pos > k : 说明第 k 个位置上的元素,在 pos 的左侧;
- 如果 pos == k: 返回结果