基于另一个阵列对一个阵列进行排序

时间:2015-11-27 14:59:11

标签: c++ arrays sorting c++11 bigdata

我用C ++编写代码(使用c ++ 11标准),我有两个内置类型的大数组,我想根据第一个对第二个进行排序。 这是一个例子:

A = {1, 5, 4, 3, 6, 2};
B = {1, 2, 3, 4, 5, 6};
排序后

A = {1, 2, 3, 4, 5, 6};
B = {1, 6, 4, 3, 2, 5};

好像每个元素B[i]都附加到元素A[i],您只需对数组A进行排序。因此,B中的元素会根据A中的相应元素移动。我知道这些问题一再被问到,但我遇到的唯一解决方案是使用pair<type 1, type 2>。但是考虑到数组很大,需要花费很长时间来为对数组和来回复制数组分配内存。 但我相信排序可以就地完成,即只使用O(1)内存。事实上,如果std :: sort允许换装服装,那就没问题了。因为我认为除了比较器之外,排序算法使用的是唯一的东西。

A = vector<double>(1e6);  // some random numbers
B = vector<double>(1e6);  // some random numbers
Comp comp(&A,&B);
Swap swap(&A,&B);
costume_sort(A,B,comp,swap);   // some sort function that can take costume swap and compare

class Comp {
   vector<double> *A;
   vector<double> *B;
   Comp(vector<double> *A, vector<double> *B) : A(A),B(B) {};

   bool compareTo(size_t i, size_t j) { return A->at(i) < A->at(j); };
};


class Swap {
   vector<double> *A;
   vector<double> *B;
   Swap(vector<double> *A, vector<double> *B) : A(A),B(B) {};

   void swapFnc(size_t i, size_t j) { swap(A->at(i), A->at(j));swap(B->at(i), B->at(j)); };
};

STL或其他可用的库中是否有任何功能可以做到这一点?这是我想在这里解释的一种伪代码。显然这不准确,但我希望我的意思很清楚。

3 个答案:

答案 0 :(得分:0)

您可以根据与相关帖子类似的索引进行排序:std::sort and custom swap function

它不是自定义交换功能并分配了更多内存,但应该运行良好。

如果您要定义类型,则可以重载std::swap以执行您想要的操作:How to overload std::swap()

答案 1 :(得分:0)

不存在符合您要求的std::功能。

尽管可以提供其自定义comparison (so Q&A)swap (so Q&A)仿函数,但这些仿函数会对要比较或交换的项目进行(常量)引用,而不是对假设容器的索引。实际上,这些仿函数应该具有比较和交换非包含对象的意义。

答案 2 :(得分:0)

根据指向[]的有序指针数组对[]和b []进行重新排序的示例。由于使用了指针数组,因此compare函数只需要知道要比较的元素的类型。对代码时间复杂度的重新排序是O(n),每个商店在其排序位置放置一个值。请注意,在重新排序期间,指针数组将恢复为原始状态(&amp; a [0] ...&amp; a [n-1])。

setStreamType