qsort长时间无法正常工作

时间:2017-07-06 07:05:55

标签: c qsort long-long

我正在排序一个二维数组a [n] [2],相对于[i] [0],[i + 1] [0]打破与非递减a [i] [1]的联系],A [1 + 1] [1]。 qsort在整数数组中运行良好,但长数组没有。

整数数组代码

#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

3 个答案:

答案 0 :(得分:1)

即使您将数据类型更改为int *,您仍然会在比较函数中转换为long long

答案 1 :(得分: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;
}

答案 2 :(得分:0)

如果您在编译时启用了警告(-Wall -pedantic用于gcc),您应该注意到long long int需要不同的占位符,并且您不能认为它是{{1} }}。你也错误地比较了比较函数的参数。 请注意,两个64-bit之间的差异可能超出long long int的范围,因此您无法使用(我编写的那个)int来比较实现。这是代码:

qsort()