0

我正在对二维数组 a[n][2] 进行排序,关于 a[i][0],a[i+1][0] 与非递减 a[i][1],a [i+1][1]。qsort 在整数数组上工作得很好,但在 long long 数组上却不行。

整数数组代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>

int cmpfunc(const void* a, const void* b)
{
    int x = ((int*)a)[0] - ((int*)b)[0];
    if (x != 0) {
        return x;
    }
    return ((int*)a)[1] - ((int*)b)[1];
}

int main(int argc, char const* argv[])
{
    int n, i, j;
    scanf("%d", &n);
    int a[n][2];
    for (i = 0; i < n; i = i + 1) {
        scanf("%d %d", &a[i][0], &a[i][1]);
    }
    qsort(a, n, sizeof(a[0]), cmpfunc);
    for (i = 0; i < n; i = i + 1) {
        printf("%d %d\n", a[i][0], a[i][1]);
    }
    return 0;
}

长长的数组代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>

int cmpfunc(const void* a, const void* b)
{
    int x = ((int*)a)[0] - ((int*)b)[0];
    if (x != 0) {
        return x;
    }
    return ((int*)a)[1] - ((int*)b)[1];
}

int main(int argc, char const* argv[])
{
    int n, i, j;
    scanf("%d", &n);
    long long a[n][2];
    for (i = 0; i < n; i = i + 1) {
        scanf("%I64d %I64d", &a[i][0], &a[i][1]);
    }
    qsort(a, n, sizeof(a[0]), cmpfunc);
    for (i = 0; i < n; i = i + 1) {
        printf("%I64d %I64d\n", a[i][0], a[i][1]);
    }
    return 0;
}

输入:

5
4 3
4 2
4 1
4 1
4 1

第一个代码的输出:

4 1
4 1
4 1
4 2
4 3

第二个代码的输出:

4 2
4 1
4 1
4 1
4 3
4

3 回答 3

1

int *即使您将数据的类型更改为long long.

于 2017-07-06T07:09:19.633 回答
1

您实际上有两个问题:第一个是无效转换的问题。第二个也是关于无效的铸造但出于另一个原因。

正如我的评论之一所述,该qsort函数将指向元素的指针传递给比较函数。如果你有一个数组arr,那么qsort将使用类似的东西&arr[0]作为参数。这意味着如果数组的数据本身就是数组,那么参数将是指向数组的指针。在您的具体情况下,参数类型确实是long long (*)[2],不仅仅是long long *

所以比较函数应该看起来像这样:

int cmpfunc(const void* a_, const void* b_)
{
    long long (*a)[2] = (long long (*)[2]) a_;
    long long (*b)[2] = (long long (*)[2]) b_;

    long long result;

    if ((*a)[0] - (*b)[0] != 0)
        result = (*a)[0] - (*b)[0];
    else
        result = (*a)[1] - (*b)[1];

    if (result < 0)
        return -1;
    else if (result > 0)
        return 1;
    else
        return 0;
}
于 2017-07-06T07:19:19.397 回答
0

如果您在编译时启用警告(-Wall -pedantic对于 gcc),您应该注意到您需要不同的占位符,long long int并且您不能假设它是64-bit. 您还错误地转换了比较函数的参数。请注意,两者之间的差异long long int可能超出 an 的范围,int因此您不能使用那个(我写的那个)qsort()比较实现。这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void *a,const void *b){
    long long int x=((long long int *)a)[0]-((long long int *)b)[0];
    if(x!=0){
        return x;
    }
    return ((long long int *)a)[1]-((long long int *)b)[1];
    }


int main(int argc, char const *argv[]){
    int n,i;
    scanf("%d",&n);
    long long a[n][2];
    for(i=0;i<n;i=i+1){
        scanf("%lld %lld",&a[i][0],&a[i][1]);
    }
    qsort(a,n,sizeof(a[0]),cmpfunc);
    for(i=0;i<n;i=i+1){
        printf("%lld %lld\n",a[i][0],a[i][1]);
    }
    return 0;
}
于 2017-07-06T07:16:45.230 回答