试想一下,如果让你自己设计qsort函数,需要些什么东西,首地址要有吧,总共有几个元素要有吧,每个元素占多大的内存要有吧(想想就知道函数内部要根据内存块的大小交换数据实现排序),最后一个规则总要有吧,qsort的灵活性在于规则是活的不是死的,其实大多数语言的排序都是类似的机制啦。。。看下qsort的原型
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
base就是所谓的首地址,nelem就是元素个数,width,就是每个元素的大小,fcmp是一个函数指针,这里函数的定义要类似于int cmp(const void*a,const void*b),其实很多人不知道怎么使用qsort主要是在于对这个函数不懂得如何写,其实想想就知道函数把每个元素的地址扔给比较函数,根据比较函数的返回值来决定到底是a在前面还是b在前面,所以在函数里面要先取出值,所以一般的写法就是
int cmp(const void*a,const void*b)
{
return *(T*)a-*(T*)b;
}
先强制转换成T类型再用取值符号*取出指,函数之所以用空指针是因为空指针可以指向任何类型,对于基本类型,只要将T修改为基本类型就行了,对于结构体之类的的指针,则return ((T*)a)->x-((T*)b)->x;其中T就是结构体的名称,x就是你要比较的字段,当然如果你要降序的话就将ab颠倒就行了,说了这么多,写一个例子,比如要对下面的数组排序
int a[5]={2,10,5,4,0};
qsort(a,5,sizeof(int),cmp);
比较函数
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
。。呵呵,啰嗦了点。希望对你有帮助
21 1
查看全部3个回答
周围人还关注
超越轻卡
海外手游充值
c语言入门知识
c语言入门
变频直驱
六间房热舞
六间房直播间
如何学习