2010-06-15 123 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);