对多维数组进行排序并保留索引C ++

时间:2015-07-30 05:51:30

标签: c++ arrays sorting

是否可以使用C ++中的sort对多维数组(逐行)进行排序,以便保存索引?

例如,

13, 14, 5, 16
0, 4, 3, 2
7, 3, 7, 6
9, 1, 11, 12

变为:

{ 5,13,14,16}
{ 0,2,3,4 }
{ 3,6,7,7}
{ 1,9,11,12 } 

带索引的数组将是:

{2,0,1,3}
{0,3,2,1}
{1,3,0,2}
{ 1,0,2,3}

2 个答案:

答案 0 :(得分:2)

首先创建整数索引数组;这里是一维数组:

int ind[arr.size()];
for( int i=0; i<arr.size(); ++i)
    ind[i] = i;

然后创建比较对象。这是C ++ 99术语中的一个球场;对于C ++ 11,您可以使用lambda来快捷方式:

struct compare
{
    bool operator()( int left, int right ) {
        return arr[left] < arr[right];
    }
};

使用该仿函数对索引数组进行排序:

std::sort( ind, ind+sizeof(arr), compare );

最后,使用排序索引数组对values数组进行排序。

答案 1 :(得分:0)

是。要逐行排序,您必须在sort函数中设置适当的起点和终点。要保留索引部分,您可以首先使用make_pair命令创建数组元素和索引的对。执行上面的代码后,您可以重建索引数组。

你需要做这样的事情(虽然我没试过):

for (i = 0; i < matrix.size(); i++)
{
  sort(matrix[i].begin(), matrix[i].end());
}

请记住将索引添加为对中的第二个元素,因为对的默认比较运算符会检查第一个元素,然后是第二个元素。