1. 排序
排序算法(Sorting Algorithm)是一种将一组特定的数据按某种顺序进行排列的算法。
除了时空复杂度,我们通常还关心排序算法的稳定性,稳定的排序算法不改变原始数据相等元素的顺序。
1. 归并排序
归并排序(Merge Sort)基于分治思想将数组分段排序后合并,时间复杂度在最优、最坏与平均的情况下均为 ,空间复杂度为 ,是一个稳定的排序算法。
归并排序的核心是合并过程,假设一个 std::vector 已经被划分为有序的两个部分: 和 ,那我们的合并逻辑可以是:
1 | template<typename T> |
对于两份正序数据,合并它们只需要同时遍历二者,结果中加入当前较小元素。当其中一份数据遍历完成后,将剩余的另一份数据追加在结果尾部。
上述代码中两种
std::move的用法并不一样,前者将左值转换为右值引用,以便调用移动构造函数避免拷贝。后者则是将源范围的元素移动到目标范围。
而归并排序的过程可以看作是将源数据划分为两部分,对这两部分分别执行归并排序,再合并的过程:
1 | template<typename T> |
二路归并是最常见的写法,如果数据规模巨大,完全可以结合并行技术使用多路归并。
Reference
