2010-06-15 77 views
4

我需要使用C或C++对多列上的双精度数组进行排序。有人能指点我应该使用的算法还是现有的库(可能是boost?),它具有这种功能?在多列上排序2维数组

我有一种感觉,写一个递归函数可能是要走的路,但我懒得写出算法或自己实现它,如果它已在别处完成。 :-)

由于

+4

你只排序上一个可以列在同一时间。然而,如果排序列中的两个元素相等,则可以回退到另一个辅助列......顺便说一句,“我太懒了”这个词从未遇到过。 – Warty 2010-06-15 00:53:11

+0

那么我已经做了一些公平的编码,我知道没有现有的代码(例如,用于扩展现有技术状态的各种统计模型的MCMC采样器)。我更喜欢懒惰,而不是重新发明轮子,尤其是在一个地区,我相信这里应该有一些东西。 – vad 2010-06-15 01:00:36

+0

1)什么顺序?对每个柱子分别进行排序?按行排序?沿着柱子? 2)小尺寸是固定的还是指针数组? – adf88 2010-06-15 04:37:33

回答

9

可以使用std::sort(C++)或qsort(C或C++),以执行排序操作。棘手的部分是你需要定义一个自定义的比较函数来比较你的行。例如:

bool compareTwoRows(double* rowA, double* rowB){ 
    return ((rowA[0]<rowB[0]) || ((rowA[0]==rowB[0])&&(rowA[1]<rowB[1]))); 
} 

// ... 
double** two_dimensional_array = // ... 
int rows = // ... number of rows ... 
std::sort(two_dimensional_array,two_dimensional_array+rows,&compareTwoRows); 
// ... 
+0

这应该工作。我知道qsort和std :: sort,但从来没有想过将比较函数扩展到多于1列。 我会执行它,并会接受你的答案,如果它适合我​​。感谢您的快速回复。 – vad 2010-06-15 01:02:32

+1

您也可以使用std :: stable_sort - 只需从_least_ significant列开始重复排序数组。 – 2010-06-15 16:02:41

+0

这一个是完美的答案..!谢谢@michael aaron safyan – 2013-01-02 05:33:20

0

我用下面的代码:

// Order function. Change the 2 for the column number you want to use 
bool compareRowsByColumn(vector<double> rowA, vector<double> rowB){ 
    return (rowA[2] < rowB[2]); 
} 

// The sorting line. Matrix is the two dimensional vector. 
sort(matrix.begin(), matrix.end(), &compareRowsByColumn);