【发布时间】:2013-04-06 20:59:56
【问题描述】:
我有一个通用的快速排序功能:
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))
它不起作用。有人知道为什么吗?
我正在使用 MinGW 在 Windows 下使用 Code::Blocks。
【问题讨论】:
-
指针算法对空指针无效。
-
“不起作用”是什么意思?它实际上是做什么的?
-
@djechlin 实际上并没有对数组进行排序
-
qsort是标准库函数的名称。选择不同的名称,除非您正在实现标准库。您的cmp和swap函数与您的qsort函数的参数类型不兼容。你的编译器应该抱怨这个;如果没有,请启用更多警告。如果您发布 self-contained program 而不是多个代码 sn-ps,那么诊断您的问题会更容易。样本输入和输出也会有所帮助;很难说“以随机顺序修改”是什么意思。 -
你认为
void qsort( const void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) );的标准库实现传递 size 参数只是为了好玩?考虑为什么需要它。
标签: c pointers function-pointers