基于另一个 1D 数组的 3D 数组快速排序

本文关键字:数组 快速排序 3D 1D 另一个 | 更新日期: 2023-09-27 17:56:19

我有一个包含值的 3D 数组,我想根据 1D 数组中列出的值对其进行排序。例如

3d 数组的值为:

1 2 3
4 5 6
7 8 9

一维数组的值为:

20 
11
12

因此,如果我们认为 3D 数组与 1D 数组相关(行彼此相关),那么我想要的 3D 数组结果是:

4 5 6 
7 8 9
1 2 3

我已经搜索了一个快速排序算法,但我找不到我想要的算法。

基于另一个 1D 数组的 3D 数组快速排序

您可以实现一个"参数快速排序",该快速排序返回将非常轻松地对数组进行排序的索引。 下面是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 .

如果您打算使用 C#,则可以使用带有"按表达式进行分组"子句的 LINQ 查询。根据源数据和上下文,这甚至可能是对数据进行排序的可取方法。