我如何排序数组的元素,而不是它的索引?

时间:2017-11-21 12:49:19

标签: c++

所以我有一个像这样的数组:

int array[]={2, 4, 3, 1};

我想按降序排序,但得到原始索引,如下所示:     {1,2,0,3} 我如何解决这个问题,以便它适用于任何大小的数组? 另外,有没有一个解决方案不需要C ++ 11?

谢谢!

4 个答案:

答案 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访问原始索引。