我有一个通用的快速排序函数:
void qsort(void* sup,int n,
int(*cmp) (void *x,void *y),
void (*swap) (void *a,void *b))
{
int pv=n/2,l=0,h=n-1;
if(n<2)
return;
while(h-1>=l)
{
if(l==pv)
{
swap(sup+pv,sup+pv+1);
pv++;
}
if(h==pv)
{
swap(sup+pv,sup+(pv-1));
pv--;
}
if(cmp(sup+h, sup+pv))
{
h--;
continue;
}
if(cmp(sup+pv, sup+l))
{
l++;
continue;
}
swap(sup+l,sup+h);
l++,h--;
}
qsort(sup, l, cmp, swap);
qsort(sup+l,n-l, cmp, swap);
}
以这些函数作为参数:
int cmp(int *c1, int *c2) {
return *c1 > *c2;
}
void swap(int *a,int *b)
{
int c= *a;
*a=*b;
*b=c;
}
主要功能如下:
int main()
{
int arr[4] = {3,4,1,2};
print(arr, 4);
printf("\n\n");
qsort(arr, 4, &cmp, &swap);
print(arr, 4);
return 0;
}
打印位置:
void print(int* arr, int size) {
int i = 0;
for(; i < size; ++i) {
printf("%d \t", arr[i]);
}
}
问题是:
当
qsort
的原型是:void qsort(int* sup,int n,
int(*cmp) (void *x,void *y),
void (*swap) (void *a,void *b))
效果很好,
但当我将
sup
参数更改为void*
时:void qsort(void* sup,int n,
int(*cmp) (void *x,void *y),
void (*swap) (void *a,void *b))
它不起作用。有人知道为什么吗?
我在用Windows下的Code::Blocks和MinGW。
最佳答案
您必须能够取消对参数的引用。void*
无法取消引用,因为编译器无法确定要传递的类型。如果通过void*
,则必须使用显式强制转换。
这个
void qsort(int* sup,int n,
int(*cmp) (void *x,void *y),
void (*swap) (void *a,void *b))
很好,但在这里
void qsort(void* sup,int n,
int(*cmp) (void *x,void *y),
void (*swap) (void *a,void *b))
您正在传递一个
void*
(sup),而这个不能取消引用。所以您的第一个解决方案很好,但是您必须在(*cmp)
中进行类型转换,或者为每种类型定义一个qsort。