用c中的qsort排序

时间:2013-01-05 14:29:48

标签: c generics pointers

我有2个问题。一个关于realloc和一个关于使用qsort排序。在我的下面的代码中,我继续崩溃“temp = realloc(输入,(i + 1)* sizeof(int));”,但一切都适用于“i + 2”。为什么? :/ 我将整数放入数组中,直到输入整数“< 0”。然后我打印一些地址。

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        int *input,*temp,*f,*l;
        input=malloc(sizeof(int));
        int x,i,counter;
        counter=0;
        i=0;
        while (x>=0)
        {
            scanf("%d",&x);
            if(x<0) break;
            input[i]=x;
            temp=realloc(input,(i+2)*sizeof(int));
            counter++;
            i++;
            if (temp!=NULL) input=temp;
            else
            {
                    free(input);
                    printf("Error allocating memory!\n");
                    return 1;
            }
        }
    for(i=0; i<counter; i++) printf("Input: %d",input[i]);
    printf("table address: %p",&input);
    printf("first element address: %p",&input[0]);
    printf("last element address: %p",&input[counter-1]);
    }

关于使用qsort对此数组进行排序。我在“cplusplus.com”中找到了这段代码:

    /* qsort example */
    #include <stdio.h>
    #include <stdlib.h>

    int values[] = { 40, 10, 100, 90, 20, 25 };

    int compare (const void * a, const void * b)
    {
        return ( *(int*)a - *(int*)b );
    }

    int main ()
    {
        int n;
        qsort (values, 6, sizeof(int), compare);
        for (n=0; n<6; n++)
        printf ("%d ",values[n]);
        return 0;
    }

我无法理解指针a和b是如何连接到示例的数组的。如果我想使用不同的排序算法,或者从大到小排序,我应该更改“return((int )a - (int )b);”?? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 您不应在此处使用realloc。你知道表的大小是多少,它是x。因此,首先使用x在长度为malloc的表中进行分配。此外,for循环更适合此处,而不是while。只是风格上的改进。

  2. 是的,您更改了该部分,应该( *(int*)b - *(int*)a )从大到小排序。