【发布时间】:2012-07-07 12:15:52
【问题描述】:
大家好,我正在编写一个用 C 语言对一般元素进行排序的程序。它可以对任何类型的对象(整数、浮点数、复数、对象)进行排序
我想到的是使用空指针,
void qsort(void *ptr,int sz,int i,int j,int (*fptr) (const void *,const void *) )
{
if(i<j)
{
int p=(i+j)/2;
p=partition(ptr,sz,i,j,p,fptr);
qsort(ptr,size,i,p-1,fptr);
qsort(ptr,size,p+1,j,fptr);
}
}
比较
通过 sz 的值我们可以知道它是指向 string、int、char、float 等的指针
int compare(const void* a,const void* b,int sz)
{
if(sz==0) //means pointer to a string
return strcmp( (char*)a, (char*)b );
else if(sz==1) //means int
return *(int*)a - *(int*)b;
else if(sz==2) //means float
return *(float*)a- *(float*)b;
else if(sz==3)
return *(char*)a- *(char*)b;
}
用于交换两个元素
void swap(void *a,void *b,int sz)//for swapping
{
if(sz==0)
{
void *c;
c=a;
a=b;
b=c;
}
else if(sz==1)
{
a=(int*)a;
b=(int*)b;
int c;
c= *a;
*a=*b;
*b=c;
}
else if(sz==2)
{
a=(float*)a;
b=(float*)b;
float c;
c= *a;
*a=*b;
*b=c;
}
已编辑
qsort(arr,4,0,9,&compare);
完整的代码正在构建中,请告诉我是否可以在我的方法中进行一些优化,或者针对这个问题提供一些更好的替代方案。 在我看来,它的尺寸真的会很大
提前很多很多
【问题讨论】:
-
你有理由不使用通常的 qsort 功能吗? linux.die.net/man/3/qsort
-
我不会担心大小,但枚举会让你的代码更具可读性。顺便说一句,您在 swap() 中的方法不起作用:具体来说,当您先说“a=(int*)a”然后说“a=*b”时,对于第二个语句,a 和 b 不是更长的int.
-
在风格上,您可以使用 switch 语句,而不是长长的 if 链。
-
我已经用
int数组的示例更新了我的答案。这个想法是一样的,调用者会传入一个不同的比较函数,一个特定于他们的数组的函数。 -
是的,这样更好,因为你不知道他们想要排序什么疯狂的数组类型。
标签: c sorting void-pointers