重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
试想一下,如果让你自己设计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;
}
。。呵呵,啰嗦了点。希望对你有帮助
#includestdio.h
#includestdlib.h
#define N 100
int cmp(const void*a,const void*b)
{//快速排序比较函数
int *x=(int*)a;
int *y=(int*)b;
return *y-*x;
}
int main()
{
int a[N]={9,7,5,3,1};
int b[N]={8,6,4,2,0};
int sum[2*N]={0};//合并数组
int k=0;//合并数组元素个数的计数
for(int i=0;i5;i++)
{
sum[k++]=a[i];//a数组元素赋值给sum数组
}
for(int i=0;i5;i++)
{
sum[k++]=b[i];//b数组元素赋值给sum数组
}
qsort(sum,10,sizeof(sum[0]),cmp);//降序排序
for(int i=0;ik;i++)//输出
printf("%d ",sum[i]);
return 0;
}
qsort是编译器函数库自带的快速排序函数。其原型为:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
参数含义如下:
base: 待排序数组首地址。
num: 数组中待排序元素数量。
width: 各元素的占用空间大小。
compare: 指向函数的指针,用于确定排序的顺序。
比较难以理解的是compare函数指针,其确定了如何去排序,通过修改该函数指针指向的函数体,可以对复杂类型进行排序,如结构体等。 也可以改变排序方式,如升序或降序。
要达到问题中的效果,需要在第一个参数传入数据所在行的首地址,第二个参数传入一行中元素的个数,第三行传入每个元素占用的空间,第四个传入自定义的比较函数指针(函数名)。
下面就以一个3行4列整型数组a[3][4],对其第二行(a[1])进行升序排序为例,写一个代码,辅助理解。
#include stdio.h
#include stdlib.h
int cmp(const void *a, const void *b)
{
return *((int *)a) *((int *)b);//由于是整型数组,所以将指针转为整型指针后取值,再比较。
}
int main()
{
int a[3][4] =
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};//定义的原始数组,可以看到是乱序的。
int i,j;
qsort(a[1], 4, sizeof(int), cmp);
//以下代码输出数组元素值,以验证排序结果。
for(i = 0; i 3; i ++)
{
for(j = 0; j 4; j ++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
程序运行后输出:
5 1 54 6
12 22 32 44
34 5 2 1
可以看到第二行已经升序排列,而其它两个没有变化。
qsort函数是编译器函数库自带的快速排序函数。
qsort 的函数原型是:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
它的参数为: 1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
它在使用的时候需要包含头文件:stdlib.h
实例:
#includestdio.h
#includestdlib.h
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int *array;
int n;
scanf("%d",n);
array=(int*)malloc(n*sizeof(int));
int i=0;
for(;in;i++)
{
scanf("%d",(array+i));
}
qsort(array,n,sizeof(int),comp);
for(i=0;in;i++)
{
printf("%d\t",array[i]);
}
return0;
}