qsort
函数位于 stdlib.h 的头文件中。
一、函数原型
1.1 qsort函数
void qsort(void* base, size_t n, size_t size, int (*compar)(const void*,const void*));
base
—— 指向目标数组首地址的指针,转换为 void* 类型;n
—— 目标数组的元素个数,size_t 为无符号整型;size
—— 目标数组各个元素所占的字节数;compar
—— 指向比较两元素的函数的指针,该函数会被 qsort 函数反复调用来比较两元素;
1.2 元素比较函数 —— compar
1.2.1 函数原型
int compar (const void* p1,const void* p2);
函数参数为两个指针,转换为 void* 类型。
1.2.3 功能
返回值 | 含义 |
---|---|
< 0 | p1 指向的元素放在p2前面 |
0 | p1 指向的元素与p2等价 |
> 0 | p1 指向的元素放在p2后面 |
1.2.2 函数举例
//举例1 —— 常用
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b ); //强制类型转换
}
//举例2
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;
}
//举例3:字符串数组排序
int compar(const void *s1, const void *s2)
{
return strcmp(*(char**)s1, *(char**)s2);
}
- 举例1中,整数相减可能导致数据溢出,因此使用 if 语句来比较
*(int*)a
和*(int*)b
的值更安全
二、函数功能
- 对 base 指向的数组的 n 个元素进行排序,每个元素大小为字节长,使用
compar
函数确定顺序。 - 此函数使用的排序算法是通过调用比较函数来比较一对数组元素,以指针作为比较函数的参数;
- 此函数无返回值,但会修改 base 所指向的数组的内容,并按照
compar
的定义对其元素进行重新排序; - 等价元素的顺序未被定义。
三、举例
3.1 int
型数组重排序
#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); //qsort函数的调用
for (n=0; n<6; n++)
printf ("%d ",values[n]);
printf("\n");
return 0;
}
输出结果:
3.2 字符串重排序
#include <stdio.h>
#include <stdlib.h>
int compar(void* a, void* b);
int main ()
{
char a[6] = {'v', 'a', 'f', 'd', 't', '\0'};
qsort(a, 5, sizeof(char), compar);
printf("%s\n", a);
return 0;
}
//排序规则函数
int compar(void* a, void* b)
{
return (*(char*)a - *(char*)b);
}
输出结果: