簡體   English   中英

qsort長時間不正常工作

[英]qsort not working properly with long long

我正在相對於a [i] [0],a [i + 1] [0]打破關系而不減少a [i] [1],a的二維數組a [n] [2] [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

即使將數據類型更改為long long您也仍然會在比較函數中強制轉換為int *

您實際上有兩個問題:第一個是鑄件無效的問題。 第二個也是關於無效轉換的原因,但是還有另一個原因。

如我的評論之一所述, qsort函數將指向元素的指針傳遞給比較函數。 如果沒有數組arrqsort將使用&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;
}

如果在編譯時啟用警告(對於gcc為-Wall -pedantic ),則應注意,對於long long int ,您需要使用其他占位符,並且不能認為它是64-bit 您還會錯誤地添加比較功能的參數。 請注意兩者之間的區別long long int可以是一個范圍之外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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM