排序三个向量,基于一个的排列,有重复项

Sorting Three vectors based on the arrangement of one, with duplicates.

本文关键字:排列 于一个 三个 排序 向量      更新时间:2023-10-16
vector<int> reference = ages;
sort(ages.begin(),ages.end());
for (int i=0; i<20 ;++i){
    for (int j=0; j<20; ++j){
        if (ages[i]==reference[j]){
            cout << setw(LongestString(names))<<names[j] <<setw(agewidth)<<ages[i]<<setw(probwidth)<<prob[j]<<endl;
        }
    }
}

我有三个向量,我想根据年龄对它们进行排序,然后重新排序。然而,在时代中有重复的,所以每当它到达这些,它就会多次打印它们。有没有办法在不创建结构的情况下防止这种情况发生?

生成从0到ages.size()-1的索引向量。根据年龄对索引进行排序,可能使用lambda比较函数。然后根据排序后的索引向量对这三个向量重新排序。这将使所有三个向量保持"同步",无论年龄是否重复。

如果你只是按照索引排序[i] = original[sorted_index[i]]复制一个向量,那么重新排序是很简单的。就地重新排序也可以做到,如下面的例子所示,但这是一个鲜为人知的算法,如果这是作业,我不知道学生应该在哪里知道这个算法或者能够找到这个算法的例子。该算法基于这样一个事实:排列可以被认为是一个循环序列:

http://en.wikipedia.org/wiki/Permutation Cycle_notation

    std::vector <int> A;                // ages
    std::vector <std::string> N;        // names
    std::vector <int> Z;                // zip codes
    std::vector <size_t> I;             // indices
    // vectors A, N, Z are initialized here ...
    // initialize vector of indices
    for(size_t i = 0; i < A.size(); i++)
        I.push_back(i);
    // sort vector of indices according to A
    std::stable_sort(I.begin(), I.end(),
        [&A](size_t i, size_t j) {return 
        A[i] < A[j];});
    // reorder A, N, Z in place also restore I back to 0 to size-1
    // time complexity is O(n)
    // every move places an element in its sorted position
    for(size_t i = 0; i < A.size(); i++){
        size_t j, k;
        int tA;                         // temp variables
        std::string tN;
        int tZ;
        if(i != I[i]){
            tA = A[i];
            tN = N[i];
            tZ = Z[i];
            k = i;
            while(i != (j = I[k])){
                A[k] = A[j];
                N[k] = N[j];
                Z[k] = Z[j];
                I[k] = k;
                k = j;
            }
            A[k] = tA;
            N[k] = tN;
            Z[k] = tZ;
            I[k] = k;
        }
    }