Я делал это несколько раз в разных ситуациях. Вместо того, чтобы сортировать массив, просто создайте новый массив, в котором есть отсортированные индексы.
Например, у вас есть массив длины n (вектор), и 2d массив nxn выдвигается. Создайте новый индекс массива, который содержит значения [0, n-1].
Тогда вместо того, чтобы обращаться к evals как evals [i], вы получаете доступ к нему как evals [index [i]], а вместо evects [i] [j] вы получаете доступ к evects [index [i]] [j].
Теперь вы пишете свою процедуру сортировки для сортировки массива индекса, а не массива evals, поэтому вместо индекса в виде {0, 1, 2, ..., n-1} значение в массиве индекса будет в порядке возрастания значений в массиве evals.
Итак, после сортировки, если вы сделаете это:
for (int i=0;i<n;++i)
{
cout << evals[index[i]] << endl;
}
вы получите отсортированный список уловок.
таким образом, вы можете сортировать все, что связано с этим массивом evals, без реального перемещения памяти. Это важно, когда n становится большим, вы не хотите перемещаться по столбцам матрицы evects.
в основном i-й наименьший eval будет расположен в index [i], и это соответствует index [i] thvect.
Отредактировано, чтобы добавить. Вот функция сортировки, которую я написал для работы с std :: sort, чтобы сделать то, что я только что сказал:
template <class DataType, class IndexType>
class SortIndicesInc
{
protected:
DataType* mData;
public:
SortIndicesInc(DataType* Data) : mData(Data) {}
Bool operator()(const IndexType& i, const IndexType& j) const
{
return mData[i]<mData[j];
}
};