繁体   English   中英

如何用C ++编写一种通用的排序函数?

[英]How could one write a generic sorting function in C++?

有没有可能用C ++中的单个函数对自然意义上的所有数据进行排序? 就我而言,我定义了一个基于模板数据类型的链表结构,并且我希望对该链表进行排序,无论它包含在数据中如何。

泛型的含义有多个维度:

  1. 关于数据的通用
  2. 关于容器的通用

首先是最容易解决的。 我们需要考虑排序需要什么:数据的严格弱排序 现在我们知道了需要提供给排序算法的函数的性质,并且需要一种传递函数的方法。 在C ++中,假定operator<实现这样的命令或将Functor传递给实现它的算法已成为一种规范。 因此签名将变为:

template<typename T, typename Comp = std::less<T>>
my_sort(my_list<T>& l, Comp c = Comp());

我们的排序算法必须执行另一项操作:交换元素。 因为我们在自己的小世界里,所以我们可以假设所有类型都有一个成员函数T::swap(T& rhs)来完成此任务。 在现实世界中,我们将使用自由函数std::swap (具有不合格的调用和using指令,但这是一个晦涩的技术性)。

第二个问题要棘手得多,您实际上不想解决它,因为您只希望您的排序算法可用于列表实现。 我鼓励您深入了解std :: sort及其要求,以了解为什么以这种方式实现了它,以及为什么它不适用于std::list

是的,您可以使用链接列表很自然地实现插入排序。 您可以编写具有与std :: sort相似的接口的模板化函数。

然后,您可以使用operator<来比较任何种类的元素或Compare函数。

您可以允许列表作为输入,并返回排序后的列表作为输出。

通过插入排序,复杂度将降至O(n^2) ,但这是IMO最简单的方法。 而且我认为如果没有随机访问容器,您将无法做得更好。 也许可以为列表实现合并排序。 似乎是一个不错的候选人。

或者,您可以将列表复制/移动到支持随机访问迭代器的结构中,并使用std::sort对其进行std::sort然后将其转换回列表。 从技术上讲,这将具有更好的复杂性,但是由于2次转换操作,常数因子相当大。 但是对于大名单,最终它将更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM