我有一个有趣的问题,过去两天我一直在努力解决这个问题。 我试图在C中编写一个程序,它接受以下输入数组:
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,
step1:根据第3列对上面的数组进行分组(根据第3列的值对4个元素(即每行)的元组进行排序:
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:最后根据每个桶中的第4列对元素进行排序,如下所示:
最终输出数组:
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中执行此操作的方法。
答案 0 :(得分:5)
问题是,你真的不需要做多种事情;您可以根据元组的两个字段进行单排序。
只需使用现有的排序算法,但使用比较函数,如下所示:
if (val[2] != otherval[2])
return val[2] < otherval[2];
else
return val[3] < otherval[3];
这将使用第三列进行排序,除非值相等,在这种情况下它将使用第四列。
或者如果你想做两个单独的排序,FIRST按第四列排序,然后按第三列排序。
答案 1 :(得分: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;
}
答案 2 :(得分:2)
实际上这应该很简单。标准qsort函数进行回调,比较两个元素。只需编写回调以期望元素成为子数组并首先使用Third元素进行比较。如果第三个元素相等,则使用第四个元素进行比较。