c语言如何用qsort排序
3个回答
展开全部
试想一御举下,如果让你自己设计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;
}
。。呵呵,啰嗦了点。希望对你有帮助
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;
}
。。呵呵,啰嗦了点。希望对你有帮助
展开全部
想要自己写 就根据快排原理写就行 网上很多例子 要是想直接用 就调用STL模板库
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
qsort是标准库中的函数,可以直接使用蚂型的:
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
记得察物橘#include <败团stdlib.h>
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
记得察物橘#include <败团stdlib.h>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询