2013-06-03 60 views
1

我有一個有趣的問題,在過去的2天裏我一直在努力,但沒有具體的解決方案。 我試圖寫在C程序,其採用以下輸入數組:根據C中的4個索引的元組對數組進行排序

   1,1,5,5, 
       1,1,5,9, 
       2,2,6,2, 
       1,2,5,5, 
       1,3,6,6, 
       1,4,5,1, 
       4,1,5,6, 
       5,2,7,1, 
       1,1,6,0, 
       2,2,5,0, 

步驟1:組根據這樣的(4個元素的元組桶排序的第三列中的上述陣列(即每行)的基礎上,第3列的值:

   2,2,5,5 
       1,1,5,9, 
       1,2,5,5, 
       1,4,5,1, 
       4,1,5,6, 
       2,2,5,0, 
       2,2,6,2, 
       1,3,6,6, 
       1,1,6,0, 
       5,2,7,1 

步驟2:

最終輸出陣列::

最後基於這樣每個桶中的第四列中的元素進行排序
   2,2,5,0, 
       1,4,5,1, 
       2,2,5,5, 
       1,2,5,5, 
       4,1,5,6, 
       1,1,5,9, 
       1,1,6,0, 
       2,2,6,2, 
       1,3,6,6, 
       5,2,7,1 

第1列和第2列中的元素在上述排序過程中不起任何作用。

我已經嘗試過各種技術,使用快速排序或桶排序,然後進行後續快速排序。沒有什麼比較合適的。 任何人都可以提出一個在C中使用適當的數據結構的方法。

+1

這與在第3列和第4列組成實體的虛擬鍵上進行排序有何不同?這似乎不應該需要幾天才能考慮,除非我完全錯過了某些東西(這不會是第一次)。一個正確編寫的'qsort()'比較器和一個包含四個「值」的實體寬度(你從來沒有指定它們是'int','unsigned int','short'等等)將會/應該做很短的工作這個。 – WhozCraig

回答

3
#include <stdio.h> 
#include <stdlib.h> 

int cmp(const void *x, const void *y){ 
    int (*a)[4] = (int(*)[4])x; 
    int (*b)[4] = (int(*)[4])y; 
    if((*a)[2]==(*b)[2]) 
     return (*a)[3] - (*b)[3]; 
    else 
     return (*a)[2] - (*b)[2]; 
} 

int main(void){ 
    int data[][4] = { 
     {1,1,5,5}, 
     {1,1,5,9}, 
     {2,2,6,2}, 
     {1,2,5,5}, 
     {1,3,6,6}, 
     {1,4,5,1}, 
     {4,1,5,6}, 
     {5,2,7,1}, 
     {1,1,6,0}, 
     {2,2,5,0} 
    }; 
    int size = sizeof(data)/sizeof(data[0]); 
    int i,j; 
    qsort(data, size, sizeof(data[0]), cmp); 
    //result print 
    for(i=0;i<size;++i){ 
     for(j=0;j<4;++j) 
      printf("%d ", data[i][j]); 
     printf("\n"); 
    } 
    return 0; 
} 
+0

感謝您的回覆。不知道這可以簡單地完成。 – PGOnTheGo

5

事情是,你並不需要做多種排序;你可以做一個單一的排序根據你的元組的兩個領域。

只需使用現有的排序算法,但有一個比較功能,看起來像這樣:

if (val[2] != otherval[2]) 
    return val[2] < otherval[2]; 
else 
    return val[3] < otherval[3]; 

這將使用第三列進行排序,除非值相等,在這種情況下,它會使用第四。

或者,如果你想做兩種不同的排序,先按第四欄排序,然後按第三欄排序。

2

這實際上應該很簡單。標準的qsort函數需要一個回調函數來比較兩個元素。只需編寫回調函數以期望元素成爲子數組,然後使用Third元素進行比較。如果第三個元素相等,則使用第四個元素進行比較。

+0

+1完全一致(好像從我之前的評論中不明顯)。強調複合第三和第四列值的嚴格弱順序很重要,但看起來像您的更新反映了這一點。 – WhozCraig

+1

使用Siri口述了這個答案。需要幾個小編輯! –

+0

錯誤。當包含一個平局時,比較函數不應該比較第4個平均值,而是絕對指針值。 (請參閱OP的預期輸出) – wildplasser

相關問題