2013-06-03 62 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

相关问题