2011-05-11 34 views
0

我有一个包含数值的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 

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

+2

您所谈论的“3D阵列”实际上是一个2D阵列(两维:行和列)。 – 2011-05-11 08:28:39

+0

你正在寻找的是一个真正的快速排序,没有什么特别的。您唯一需要做的就是以某种方式将排序的“键”与它们各自的“卫星”数据相关联。 – ereOn 2011-05-11 08:33:30

+0

谢谢所有,其实它是3D,但我只是举个例子来说明它:) – 2011-05-11 08:44:00

回答

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你的二维数组行的顺序。举例来说,argsort将返回1 2 0

0

如果你打算使用C#中,你可以“通过表达”条款去LINQ查询了。 根据源数据和上下文,这甚至可能是排序数据的首选方式。

相关问题