使用比较函数作为参数调用快速排序函数

时间:2014-04-03 04:33:22

标签: c sorting function-pointers

这可能是一个非常基本的问题,但我在理解指针方面遇到了麻烦。在下面的程序中,在main方法中,我只是想知道测试Qsort函数的正确方法是什么。提前谢谢!

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



void swap(void *v[], int i, int j)
{
    void *temp;
    temp = v[i];
    v[i] = v[j];
    v[j]=temp;
}

int cmp1 (void *first_arg,  void *second_arg)
{
    int first = *(int *)first_arg;
    int second = *(int *)second_arg;
    if ( first < second )
    {
        return -1;
    }
    else if ( first == second )
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

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


void cmp3 (void *a, void *b)
{
    char one = *(char *)a;
    char two = *(char *)b;

    if (one == two){
        printf("The two values are equal");
    }

    else
    {
        printf("The two values are not equal");
    }

}

void QSort(void *v[],int left, int right, int (*compare)(void *first, void *second))
{
    int i, last;
    void swap (void *v[],int ,int);


    if(left >= right){
        return;
    }

    swap(v,left,(left+right)/2);
    last=left;
    for(i=left+1;i<=right; i++){
        if((*compare)(v[i],v[left])<0){
            swap(v,++last,i);
        }
    }

    swap(v,left,last);
    QSort(v,left,last-1,compare);
    QSort(v,last+1,right,compare);
}




int main()
{
    int first = 23;
    int second = 4;
    int third = 5;
    int temp[3];//={22,4,36,64,0};

    temp[0] = (void *)&first;
    temp[1]=(void *)&second;
    temp[2]=(void *)&third;

    QSort(temp, 0, 2, cmp1(.....));

    for(int n=0;n<3;n++){
        printf("%d ",*((int *)temp[n]));
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

cmp1真是最好的方式。它应该始终正确执行。

cmp2已接近尾声。它大部分时间都可以工作,但是如果你处理非常大的整数,结果就会出错。

cmp3绝对不对。这些值实际上是int s,但被视为char s。结果将毫无意义。

答案 1 :(得分:1)

QSort(temp, 0, 2, cmp1(.....));

应该

QSort(temp, 0, 2, cmp1);

如果foo是函数的名称,则使用foo()来调用它,并使用foo将其作为参数传递给另一个需要函数指针的函数。 / p>

答案 2 :(得分:0)

temp不是整数数组,它应该是整数指针数组。

   int temp[3]; 

应替换为

   int *temp[3];