2
如何在现代C ++中实现经典的排序算法?
在大多数实现中,C ++标准库中的std::sort算法(及其表亲std::partial_sort和std::nth_element)是更多基本排序算法(例如选择排序,插入排序,快速排序,合并排序或堆排序)的复杂混合混合。 在这里以及在姐妹网站(例如https://codereview.stackexchange.com/)上,存在许多与这些经典排序算法的错误,复杂性和实现的其他方面有关的问题。提供的大多数实现都是由原始循环,使用索引操作和具体类型组成的,并且从正确性和效率方面来说,通常都是不平凡的分析。 问题:如何使用现代C ++实现上述经典排序算法? 没有原始循环,但结合了标准库的算法构建块<algorithm> 迭代器接口和模板的使用,而不是索引操作和具体类型的使用 C ++ 14样式,包括完整的标准库以及语法降噪器,例如auto,模板别名,透明比较器和多态lambda。 注意事项: 有关排序算法实现的更多参考,请参见Wikipedia,Rosetta Code或http://www.sorting-algorithms.com/ 根据Sean Parent的约定(幻灯片39),原始循环是-循环,for比使用运算符将两个函数组成更长。So f(g(x));or f(x); g(x);or f(x) + g(x);不是原始循环,也不是内部selection_sort和insertion_sort下面的循环。 我遵循Scott Meyers的术语将当前的C ++ 1y表示为C ++ 14,并将C ++ 98和C ++ 03都表示为C ++ 98,所以不要为此而烦恼。 正如@Mehrdad的评论中所建议的那样,我在答案的末尾提供了四个作为实时示例的实现:C ++ 14,C ++ 11,C ++ 98和Boost和C ++ 98。 答案本身仅用C ++ 14表示。在相关的地方,我表示的是各种语言版本不同的语法和库差异。