如何在C ++中编写泛型排序函数?

时间:2014-01-20 12:14:08

标签: c++ sorting linked-list generic-programming

有没有可能的方法用C ++中的单个函数对自然意义上的所有类型的数据进行排序?在我的例子中,我定义了一个基于模板数据类型的链表结构,我想将该链表中的任何内容排序为数据。

2 个答案:

答案 0 :(得分:1)

泛型可能意味着多个维度:

  1. 关于数据的通用
  2. 关于容器的通用
  3. 第一个是最容易解决的问题。我们需要考虑排序需要工作的内容:strict weak ordering我们的数据。现在我们知道了我们需要为排序算法提供的函数的性质,并且需要一种传递函数的方法。在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(具有非限定调用和使用指令,但这是一个模糊的技术性)。

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

答案 1 :(得分:-1)

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

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

您可以将列表作为输入,并将排序列表作为输出返回。

使用插入排序,复杂性将降至O(n^2),但这是IMO最简单的方法。 我不认为你可以用随机访问容器做得更好。也许可以为列表实现合并排序。看起来像个好人。

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