【C标准库】stdlib
作者:wallace-lai
发布:2018-02-11
更新:2024-04-02
qsort
函数原型
void qsort(
void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *)
);
函数功能:对数组base进行排序,数组有nmemb个元素,每个元素大小为size;
(1)base:指向数组的起始地址,通常该位置传入的是一个数组名;
(2)nmemb:表示该数组的元素个数;
(3)size:表示该数组中每个元素的大小(字节数);
(4)compar:指向比较函数的函数指针,决定了排序的依据;
函数返回值:无
注意:如果两个元素的值是相同的,那么它们的前后顺序是不确定的。也就是说qsort是一个不稳定的排序算法。
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型如下所示。注意两个形参必须是const void *型,在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
(1)如果compar返回值小于0,那么p1所指向元素会被排在p2所指向元素的前面;
(2)如果compar返回值等于0,那么p1所指向元素与p2所指向元素的顺序不确定;
(3)如果compar返回值大于0,那么p1所指向元素会被排在p2所指向元素的后面;
因此,如果想让qsort进行从小到大(升序)排序,那么一个通用的compar函数可以写成这样:
int compareMyType (const void * a, const void * b)
{
if ( *(MyType*)a < *(MyType*)b ) return -1;
if ( *(MyType*)a == *(MyType*)b ) return 0;
if ( *(MyType*)a > *(MyType*)b ) return 1;
}
使用案例
/* qsort example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}