在向量矩阵中排序值,输出相应的索引

时间:2016-01-19 00:54:24

标签: sorting vector

我在下面发现这个问题得到了一些好的答案:

For example, I have a set, or vector, or matrix of samples A : [5, 2, 1, 4, 3]. I want to sort these to be B : [1,2,3,4,5], but I also want to remember the original indexes of the values, so I can get another set which would be: C : [2, 1, 4, 3, 0 ] - which corresponds to the index of the each element in 'B', in the original 'A'.

如果我将问题扩展到2个索引,例如2x3矩阵

,该怎么办?

1 5 6

4 8 2

排序(按降序排列,不按列值/按行,仅按值)

8 6 5 4 2 1

输出指数

(1,1)(0,2)(0,1)(1,0)(1,2)(0,0)

我试过,但我确定我需要帮助,任何帮助都意味着这么多......

template <typename T> vector <vector <size_t>> sort_indexes(const vector <vector <T>> &v)

//// initialize original index locations
vector<vector<size_t>> idx(v.size());
for (size_t i = 0; i != idx.size(); ++i) {
    idx[i] = i;
    for (size_t j = 0; i != idx[i].size(); ++j) {
        idx[j] = j;
    }
}
// sort indexes based on comparing values in v
sort(idx.begin(), idx.end(),
    [&v](size_t i1, size_t i2) {return v[i1] > v[i2]; });

return idx;

}

int main(){

vector<vector<int>> v;
v[0].push_back(10);
v[0].push_back(1);
v[0].push_back(3);
v[1].push_back(20);
v[1].push_back(30);
v[1].push_back(40);

for (auto i = 0; i < v.size(); i++) {
    for (auto j:sort_indexes(v) )
    cout << i << j <<"  "<< v[i][j] << endl;
}
cin.get();
return 0;

}

我为我的问题采用了这个https://stackoverflow.com/a/12399290/5807825。我尝试了一些关于代码的调整,任何人都可以解释哪些部分是错误的,或者一切......我希望不会。

1 个答案:

答案 0 :(得分:0)

为数组生成指针或索引数组,并根据数组对指针或索引进行排序。如果使用指针,compare函数只需要知道数组中元素的类型。如果使用索引,则可以使用lambda compare(假设使用C ++,Java等语言)。

使用索引和lambda compare的数组的示例C ++代码:

void examplesort(int array[], int index[], int size){
    int * tmpa = new int[size];     // temp array
    // generate indices to array
    for(int i = 0; i < size; i++)
        index[i] = i;
    // sort indices according to array
    std::sort(index, index+size,
        [&array](int i, int j) {return array[i] < array[j];});
    // tmpa[] = sorted array[]
    for(int i = 0; i < size; i++)
        tmpa[i] = array[index[i]];
    // copy tmpa to array
    for(int i = 0; i < size; i++)
        array[i] = tmpa[i];
    delete[] tmpa;
    return;
}