Quicksort通过特定成员C ++对对象数组进行排序

时间:2011-01-02 18:12:02

标签: c++ object quicksort

class Foo
{
    public:
        int num;
        int other;
};

int main()
{
    Foo bar[10].num = {1, 9, 3, 5, 1, 6, 10, 0, 6, 3};

    //quicksort(bar)

    return 0;
}

我想编写一个快速排序函数,通过'num'升序对'bar'数组进行排序。不太清楚什么是最好的方法,因为我从来没有写过快速排序。我查看了一些示例代码,但在这种情况下我无法看到如何修改它们。通过将指针传递给数组的第一个和最后一个元素来完成的就地排序不起作用,因为这只排序'num'成员,而不是整个对象。将对象数组拆分为较低的数组,数组和上部数组,并递归排序每个看起来很有希望,但我不确定如何传递值将起作用...

任何帮助非常感谢。对不起,如果之前有人询问过。

4 个答案:

答案 0 :(得分:10)

首先编写一个函数(或函子)来比较你想要的任何值的对象。它应该采取两个对象并返回一个布尔。如果第一个应该在第二个之前,它应该返回true,否则返回false。然后将其传递给std :: sort。

struct compare_Foo_by_num
{
    bool operator() (const Foo & lhs, const Foo & rhs) { return lhs.num < rhs.num; }
};

int main()
{
    Foo bar[10];

    std::sort(bar, bar+10, compare_Foo_by_num());
}

答案 1 :(得分:3)

您可以重载operator<来比较所需的成员,然后使用std::sort

#include <algorithm>

class Foo
{
public:
    int num;
    int other;
};

bool operator<(const Foo& x, const Foo& y)
{
    return x.num < y.num;
}

int main()
{
    Foo bar[10] = {{1, 5}, {9, 2}, {3, 0}, {5, 7}, {1, 3}, {6, 4}, {10, 8}, {0, 9}, {6, 2}, {3, 5}};
    std::sort(bar + 0, bar + 10);
}

请注意,您需要两个数字来初始化Foo,而不仅仅是您在排序时感兴趣的数字。

如果您不能或不想为operator<重载Foo,其他选项包括将旧的C样式函数指针或C ++样式函数对象作为第三个参数传递给{{1} }。

答案 2 :(得分:0)

如果您坚持实施自己的快速排序,我建议您观看此视频,以帮助您更好地查看算法。虽然您从未写过快速入门,但您可能会发现在观看之后更容易实现。 http://www.youtube.com/watch?v=vxENKlcs2Tw

答案 3 :(得分:0)

另一种方法是使用带有lambda表达式的std :: sort:

int main()
{
    Foo bar[10] = {{1,5},{9,2},{3,0},{5,7},{1,3},{6,4},{10,8},{0,9},{6,2},{3,5}};

    std::sort(bar, bar + 10, [](const Foo &x, const Foo &y) {
        return x.num < y.num;
    });
}