# 【C标准库】stdlib
作者:wallace-lai
发布:2018-02-11
更新:2024-04-02
## qsort
### 函数原型
```c
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 *`型转换成实际类型。
```c
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`函数可以写成这样:
```c
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;
}
```
### 使用案例
```c
/* qsort example */
#include /* printf */
#include /* 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;
}
```