C# 基于另一个一维阵列的三维阵列快速排序

C# 基于另一个一维阵列的三维阵列快速排序,c#,.net,c++,math,C#,.net,C++,Math,我有一个包含值的3D数组,我想根据1D数组中列出的值对其进行排序。 比如说, 三维阵列的值为: 1 2 3 4 5 6 7 8 9 20 11 12 1D数组的值为: 1 2 3 4 5 6 7 8 9 20 11 12 因此,如果我们认为3D数组与1D数组相关(行彼此相关),那么我希望3D数组中的结果是: 4 5 6 7 8 9 1 2 3 我已经搜索了一个快速排序算法,但是我找不到我想要的任何算法。您可以实现一个“参数快速排序”,它返回的索引可以很容易地对数组进行排序。下面是

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

三维阵列的值为:

1 2 3
4 5 6
7 8 9
20 
11
12
1D数组的值为:

1 2 3
4 5 6
7 8 9
20 
11
12
因此,如果我们认为3D数组与1D数组相关(行彼此相关),那么我希望3D数组中的结果是:

4 5 6 
7 8 9
1 2 3
我已经搜索了一个快速排序算法,但是我找不到我想要的任何算法。

您可以实现一个“参数快速排序”,它返回的索引可以很容易地对数组进行排序。下面是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);
}
#包括
模板
void arg_qsort(索引容器和索引),
常量数据容器和数据,
int左,
整数(右)
{
int i=左;
int j=右;
int pivot=left+(右-左)/2;
而(i数据[指数[枢轴])
--j;

如果(i如果您打算使用C#,那么可以使用带有“grouprowbyexpression”子句的LINQ查询。
根据源数据和上下文,这甚至可能是对数据进行排序的首选方式。

您所说的“3D数组”实际上是一个2D数组(二维:行和列)。您所关注的实际上是一个常规的快速排序,没有什么特别的。您只需以某种方式附加排序后的“键”他们各自的“卫星”数据。谢谢大家,实际上它是3D的,但我只是举个例子来说明:)