我有一个包含值的3D数组,我想根据1D数组中列出的值对其进行排序。 例如,
3d数组的值为:
1 2 3
4 5 6
7 8 9
并且1D数组的值为:
20
11
12
因此,如果我们认为3D阵列与1D阵列相关(行彼此相关),那么我在3D阵列中想要的结果是:
4 5 6
7 8 9
1 2 3
我搜索了一个快速排序算法,但我找不到任何我想要的东西。
答案 0 :(得分:1)
您可以实现一个“参数快速排序”,它返回可以很容易地对数组进行排序的索引。这是C ++中的一个实现:
#include <algorithm>
template <class IndexContainer, class DataContainer>
void arg_qsort(IndexContainer& indices,
const DataContainer& data,
int left,
int right)
{
int i = left;
int j = right;
int pivot = left + (right - left) / 2;
while (i <= j)
{
while (data[indices[i]] < data[indices[pivot]])
++i;
while (data[indices[j]] > data[indices[pivot]])
--j;
if (i <= j)
{
std::swap(indices[i], indices[j]);
++i;
--j;
}
}
if (left < j)
arg_qsort(indices, data, left, j);
if (i < right)
arg_qsort(indices, data, i, right);
}
///
/// Compute the indices that would sort the given data.
///
template <class IndexContainer, class DataContainer>
void argsort(IndexContainer& indices, const DataContainer& data)
{
int size = indices.size();
if (size == 0)
return;
for (int i = 0; i < size; ++i)
{
indices[i] = i;
}
arg_qsort(indices, data, 0, size - 1);
}
现在,您可以使用argsort
计算2D数组中行的顺序。对于您的示例,argsort
将返回1 2 0
。
答案 1 :(得分:0)
如果您打算使用C#,可以使用“表达式”子句中的“group row ”进行LINQ查询。 根据源数据和上下文,这甚至可能是对数据进行排序的首选方法。