排序一个数组和其他数组如下?

时间:2011-09-05 03:06:28

标签: c++ arrays sorting

这是C ++示例

int a[1000] = {3,1,5,4}
int b[1000] = {7,9,11,3}

如果我排序数组a,数组b也跟随数组a

,我怎么做呢?

例如

a[1000] = {1,3,4,5}
b[1000] = {9,7,3,11}

是否可以使用排序功能

sort(a,a+4)

还要对数组b进行排序吗?

编辑:如果有3个数组怎么办?

3 个答案:

答案 0 :(得分:1)

您可以使用pair的数组,而不是使用两个数组,然后使用特殊的比较函数而不是默认的小于运算符对它进行排序吗?

答案 1 :(得分:0)

最简单的方法是将数据重新排列为结构数组而不是一对数组,以便每个数据都是连续的;那么,你可以使用适当的比较器。例如:

struct CompareFirst
{
    bool operator() (const std::pair<int,int>& lhs, const std::pair<int,int>& rhs)
    {
        return lhs.first < rhs.first;
    }
};

// c[i].first contains a[i], c[i].second contains b[i] for all i
std::pair<int, int> c[1000];
std::sort(c, c+1000, CompareFirst());

如果您无法像这样重构数据,那么您需要定义一个充当RandomAccessIterator的自定义类:

struct ParallalArraySortHelper
{
    ParallelArraySortHelper(int *first, int *second)
        : a(first), b(second)
    {
    }

    int& operator[] (int index) { return a[index]; }
    int operator[] const (int index) { return a[index]; }

    ParallelArraySortHelper operator += (int distance)
    {
        a += distance;
        b += distance;
        return *this;
    }
    // etc.
    // Rest of the RandomAccessIterator requirements left as an exercise

    int *a;
    int *b;
};
...
int a[1000] = {...};
int b[1000] = {...};
std::sort(ParallalArraySortHelper(a, b), ParallelArraySortHelper(a+1000, b+1000));

答案 2 :(得分:0)

生成与原始数据大小相同的数组,其中包含数组中的索引:{0, 1, 2, 3}。现在使用自定义比较器函数来比较关联数组中的元素而不是索引本身。

template<typename T>
class CompareIndices
{
public:
    CompareIndices(const T * array) : m_AssociatedArray(array) {}
    bool operator() (int left, int right) const
    {
        return std::less(m_AssociatedArray[left], m_AssociatedArray[right]);
    }
private:
    const T * m_AssociatedArray;
};

std::sort(i, i+4, CompareIndices(a));

获得索引的排序列表后,您可以将其应用于原始数组a或您想要的任何其他b数组。