qsort函数C语言编译器函数库自带的快速排序函数。qsort 的函数原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 是base所指数组进行排序。qsort函数包含在C 标准库 - 中。1
函数简介函数声明void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数base-- 指向要排序的数组的第一个元素的指针。
nitems-- 由 base 指向的数组中元素的个数。
size-- 数组中每个元素的大小,以字节为单位。
compar-- 用来比较两个元素的函数,即函数指针(回调函数)
回调函数:
回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。2
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
如果compar返回值小于0( 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面。2
功 能使用快速排序例程进行排序。
说明该函数不返回任何值。
头文件:stdlib.h;
应用示例#include
#include
#include
int compare( const void *arg1, const void *arg2 );
int main( int argc, char **argv ) {
int i; /* Eliminate argv[0] from sort: */
argv++; argc--; /* Sort remaining args using Quicksort algorithm: */
qsort( (void *)argv(size_t)argc, sizeof( char * ), compare ); /* Output sorted list: */
for( i = 0; i
printf( " %s", argv[i] );
printf( "\n" );
}
int compare( const void *arg1, const void *arg2 ) { /* Compare all of both strings: */
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
用法说明qsort函数的用法说明如下:31
例:qsort(a,1000,sizeof(int),comp);
其中comp函数应写为:
int comp(const void*a,const void*b){return *(int*)a-*(int*)b;}上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序。
以下为compare函数原型 //comp
compare( (void *) & elem1, (void *) & elem2 );
|| ||
(1)对一维数组的排序实例(从小到大排序):
#include#includeint comp(const void*a,const void*b){return *(int*)a-*(int*)b;}int main(){int i=0;int *array;int n;scanf("%d",&n);array=(int*)malloc(n*sizeof(int));for(;ix!=d->x)returnc->x-d->x;else return d->y-c->y;}对结构体中字符串进行排序:
struct Node{int data;char str[100];}s[100];//按照结构体中字符串str的字典序排序int Comp(const void*p1,const void*p2){return strcmp((*(Node*)p1).str,(*(Node*)p2).str);}qsort(s,100,sizeof(s[0]),Comp);(4)计算几何中求凸包的Comp
int Comp(const void*p1,const void*p2)//重点Comp函数,把除了1点外的所有的点旋转角度排序{struct point*c=(point*)p1;struct point*d=(point*)p2;if(cacl(*c,*d,p[1])x,c->y,p[1].x,p[1].y)x,d->y,p[1].x,p[1].y))//如果在一条直线上,则把远的放在前面return1;elsereturn-1;}本词条内容贡献者为:
徐恒山 - 讲师 - 西北农林科技大学