0

我正在尝试使用 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元素移动

谢谢你的帮助。这是最值得赞赏的。

4

2 回答 2

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 或一个数组,这取决于你如何处理它。所以请注意我们的访问权限不会超出你的意图。)

于 2013-11-11T05:31:48.977 回答
0
int arr[10][100];
for(i=0;i<10;i++){
    qsort(arr[i],------,-----,----);
}

它是多维数组,你可以一次排序一个,qsort 不能同时排序。

于 2013-11-10T19:33:49.843 回答