所以我有一个像这样的数组:
int array[]={2, 4, 3, 1};
我想按降序排序,但得到原始索引,如下所示: {1,2,0,3} 我如何解决这个问题,以便它适用于任何大小的数组? 另外,有没有一个解决方案不需要C ++ 11?
谢谢!
答案 0 :(得分:5)
我会选择这样的事情:
std::vector<std::pair<int, int>> temp ;
int idx = 0 ;
for (auto x : array)
temp.push_back(std::make_pair(x, idx++)) ;
std::sort(temp.begin(), temp.end()) ;
您可以轻松摆脱(此处使用的唯一C ++ 11构造)的范围。无需为std :: pair定义比较,默认值为OK。
答案 1 :(得分:1)
如果我理解正确,你想获得一个索引列表。一种解决方案是创建所有元素的无序索引列表并对其进行排序。
int array[] = {2, 4, 3, 1};
int indices[] = {0, 1, 2, 3};
std::sort(indices, indices + 4, [&](int a, int b) {
return array[b] < array[a];
});
由于你要求使用非C ++ 11方式,你可以解决lambda表达式,如下所示:
int array[] = {2, 4, 3, 1};
int indices[] = {0, 1, 2, 3};
struct {
int *array;
bool operator()(int a, int b) const
{
return this->array[b] < this->array[a];
}
} customLess = {array};
std::sort(indices, indices + 4, customLess);
两种实现都会对indices
但而不是 array
本身的值进行排序。结果如下所示:
array == {2, 4, 3, 1}
indices == {1, 2, 0, 3}
答案 2 :(得分:1)
有一个棘手而简单的解决方法:首先你有一个未排序的数组,所以创建一个索引数组addr.set()
然后使用循环来排序值数组,同时交换索引数组的元素根据值数组:
{0, 1, 2, 3}
我使用int array[] = {2, 4, 3, 1};
int indexes[] = {0, 1, 2, 3};
for(int i(0); i < 4; i++){
for(int j(i + 1); j < 4; j++){
if(array[i] < array[j]){
//sorting values
array[i] ^= array[j];
array[j] ^= array[i];
array[i] ^= array[j];
// sorting indexes
indexes[i] ^= indexes[j];
indexes[j] ^= indexes[i];
indexes[i] ^= indexes[j];
}
}
}
cout << endl;
for(int i = 0; i < 4; i++)
cout << array[i] << ", ";
cout << endl;
for(int i = 0; i < 4; i++)
cout << indexes[i] << ", ";
对数组进行排序,但您可以使用临时变量:
xor
输出:
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
tmp = indexes[i];
indexes[i] = indexes[j];
indexes[j] = tmp;
答案 3 :(得分:0)
您必须在某处保存初始索引。 一种解决方案是使用结构。有点像这样:
struct IndexInt
{
int index;
int value;
} typename IndexInt_t
IndexInt_t array[]={{1,2}, {2,4}, {3,3}, {4,1}};
现在,您可以在array[i].value
之后进行排序,并通过array[i].index
访问原始索引。