【发布时间】:2019-01-01 00:38:11
【问题描述】:
我想使用 qsort() 根据第一列以降序对整数“d”的二维数组进行排序。但是,我希望第一列的每个元素与开头同一行的第二列中的元素匹配。
例如:
数组开头:
column1: { 4, 5, 1, 3, 0}
column2: { 1, 2, 3, 4, 5}
结果应该是:
column1: { 5, 4, 3, 1, 0}
column2: { 2, 1, 4, 3, 5}
我已经编写了对一维数组进行排序的代码,但我不知道如何对二维数组进行排序。
int main(){
FILE *file_in, *file_out;
file_in=fopen("file.in", "r");
fscanf(file_in, "%d", &N);
for( i = 1; i <= N; i = i + 1 ){
fscanf(file_in, "%d", &a);
fscanf(file_in, "%d", &b);
fscanf(file_in, "%d", &c);
d[i][1] = a+b+c;
d[i][2] = a*b*c
}
fclose(file_in);
int cmpfunc (const void * a, const void * b) {
return ( *(int*)b - *(int*)a );
}
qsort(d, N, sizeof(int), cmpfunc);
file_out=fopen("file.out","w");
fprintf(file_out, "%d", M);
for ( i=1; i<=N; i = i + 1){
fprintf(file_out, "%d", d);
}
fclose(file_out);
return 0;
}
提前感谢您的帮助。
【问题讨论】:
-
如果始终将两列视为一对,则一种选择是使其成为包含两个字段的
struct的一维数组。 -
另外,当您将内容视为
int时,为什么您的数组包含float?或者,为什么其他所有内容(包括格式字符串)都将它们视为int?特别是当a、b和c是int时,a - a * (b/3000) - c * a /40不太可能给出您期望的结果。 -
另外,你的范围比较是不可能的:
while (a < 1 && a > 1000000000)继续只要a小于 1 同时 大于 1000000000... 对不起,但我想说的是,在qsort变得相关之前,您需要修复很多其他问题。 -
将元素的大小设为一行的大小。效率不高,但有效。或者,分配一个索引数组,根据第一列的内容对它们进行排序。然后分配另一个原始数组大小的缓冲区,并将每一行复制到正确的位置。
-
@Arkku 数组被错误地声明为浮点数,因为我之前尝试过其他方法。您对
while也是正确的,我混淆了数据检查条件。谢谢你的建议。