一:描述
qsort函数包含在的头文件,能够对数组实现快排
二:函数声明与参数解释
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *));
数组名是 base
数组的个数是 nmemb
每个数组元素的大小是 size
函数指针为 compare,决定了排序的顺序
返回值:无
三:compare的实现规则
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型
int compar(const void *p1, const void *p2);
如果compar返回值小于0&#xff08;<0&#xff09;&#xff0c;那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0&#xff08;&#61; 0&#xff09;&#xff0c;那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0&#xff08;> 0&#xff09;&#xff0c;那么p1所指向元素会被排在p2所指向元素的后面
因此&#xff0c;如果想让qsort()进行从小到大&#xff08;升序&#xff09;排序&#xff0c;那么一个通用的compar函数可以写成这样&#xff1a;
int compareMyType (const void * a, const void * b){if ( *(MyType*)a <*(MyType*)b ) return -1;if ( *(MyType*)a &#61;&#61; *(MyType*)b ) return 0;if ( *(MyType*)a > *(MyType*)b ) return 1;}
四&#xff1a;实例
4.1 对int char l类型进行排序
int num[100]; int cmp ( const void *a , const void *b )
{ return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
4.2 对double类型进行排序&#xff08;注意&#xff09;
double in[100]; int cmp( const void *a , const void *b )
{ return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);
4.3 对结构体一级排序
struct In
{ double data; int other;
}s[100]&#xff1b;int cmp( const void *a ,const void *b)
{ return (*(struct In *)a)->data > (*(struct In *)b)->data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
4.4 对结构体二级排序
struct In
{ int x; int y;
}s[100]; //按照x从小到大排序&#xff0c;当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{ struct In *c &#61; (struct In *)a; struct In *d &#61; (struct In *)b; if(c->x !&#61; d->x) return c->x - d->x; else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
4.5 对字符串排序
struct In
{ int data; char str[100];
}s[100]; //按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{ return strcmp( (*(struct In *)a)->str , (*(struct In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);