我试图用qsort对多维数组进行排序,但结果是无意义的。
我的代码(摘录):
#include <stdio.h>
#include <stdlib.h>
int srovnejVelikost(const void *p1, const void *p2) {
const long int (*a)[5] = p1;
const long int (*b)[5] = p2;
return ((*a)[0] + (*a)[1] - (*b)[0] - (*b)[1]);
}
long int nadrze[200000][5];
[values added into the array here]
qsort (nadrze, 200000, sizeof(nadrze[0]), srovnejVelikost);
它应该根据(nadrze [a] [0] + nadrze [a] [1] - nadrze [b] [0] - nadrze [b] [1])的结果对nadrze []进行排序......所有5个元素都移动了
感谢您的帮助。非常感谢。
答案 0 :(得分:1)
如果您的排序条件是真正的nadrze[a][0] + nadrze[a][1] - nadrze[b][0] - nadrze[b]
,我会找到以下示例来表示它:
#include <stdio.h>
#include <stdlib.h>
#define max_i 5
#define max_j 5
int srovnejVelikost(const void *p1, const void *p2) {
const long int *a = p1;
const long int *b = p2;
return ((a[0] + a[1]) - (b[0] + b[1]));
}
int main(int argc, char **argv)
{
int i = 0;
int j = 0;
long int nadrze[max_i][max_j];
long int d = 0;
printf("Before\n");
for (i = 0; i < max_i; ++i) {
d = (nadrze[i][0] + nadrze[i][1]);
printf("i: %d %d\n",i, d);
}
qsort(nadrze, max_i, sizeof(long int)*max_j, srovnejVelikost);
printf("After\n");
for (i = 0; i < max_i; ++i) {
d = (nadrze[i][0] + nadrze[i][1]);
printf("i: %d %d\n",i, d);
}
return(EXIT_SUCCESS);
}
您可以根据需要扩展max_i和max_j。我正在测试时使用defines
。
另请注意,我将其编码为(a[0] + a[1]) - (b[0] + b[1])
,因为它等同于a[0] +a[1] - b[0] - b[1]
,当我为比较器读取它时更有意义。
你需要将整个行传递给qsort
,我的意思是宽度为`sizeof(ling int)* max_j,在你的情况下为5。
这有意义吗?
(qsort
比较函数并不关心你是将它传递给一个int还是一个数组,这取决于你如何处理它。所以请注意我们你不能访问它你的意思是什么。)
答案 1 :(得分:0)
int arr[10][100];
for(i=0;i<10;i++){
qsort(arr[i],------,-----,----);
}
你可以一次排序一个多维数组,qsort不能同时排序。