在多个列上对二维数组进行排序

5
我需要使用C或C ++对多列的双精度二维数组进行排序。有没有人能指点我应该使用哪个算法或现有库(例如boost)具有此功能?
我感觉编写递归函数可能是正确的方法,但如果已经有人实现了它,我懒得自己编写算法或实现它。:-)
谢谢

4
你只能一次对一个列进行排序。但是,如果排序列中有两个元素相等,你可以回退到另一个次要的列...顺便说一下,“我太懒了”这句话总是不太好听。 - Warty
我已经写了不少代码,知道某些领域没有现成的代码(例如,扩展先进状态的各种统计模型的MCMC采样器)。在这种情况下,我更喜欢懒惰而不是重复发明轮子,特别是在我相信应该有现成的东西的领域。 - vad
  1. 什么顺序?分别对每列进行排序?沿行排序?还是沿列排序?
  2. 次要大小是固定的还是指针数组?
- adf88
5
优秀的程序员是懒惰的程序员 :) - INS
2个回答

10

你可以使用 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);
 // ...

应该可以。我知道qsort和std::sort,但从未想过将比较函数扩展到多个列。我会实现它,并且如果它对我有效,我会接受你的答案。感谢您的快速回复。 - vad
1
你也可以使用std::stable_sort - 只需重复排序数组,从最不重要的列开始。 - Nick Johnson
这是完美的答案!感谢 @michael aaron safyan。 - Mohit Sehgal
Nick的解决方案很好,因为它可以很好地推广到更高的维度!想象一下,如果要为超过两列编写比较运算符,那将会很快变得复杂。 - krsteeve

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接