描述
C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 对数组进行排序。qsort函数所用的排序方式是快速排序,是一种不稳定的排序方式。
参数
- base -- 指向要排序的数组的第一个元素的指针。
- nitems -- 由 base 指向的数组中元素的个数。
- size -- 数组中每个元素的大小,以字节为单位。
- compar -- 用来比较两个元素的函数。
int* compar(const void* a, const void* b)
{
return(*(int*)a - *(int*)b);
}
如果compar返回值小于0,那么a所指向元素会被排在b所指向元素的前面;如果compar返回值等于0(= 0),那么a所指向元素与b所指向元素的顺序不确定;如果compar返回值大于0,那么a所指向元素会被排在b所指向元素的后面;
因此,如果想让qsort()进行从小到大(升序)排序,那么一个通用的compar函数可以写成这样:
int* compar(const void* a, const void* b)
{
return(*(int*)b - *(int*)a);
}
此外,通过强制转换compar输入指针参数的类型(输入一般默认为void* 型指针,上例中强制将其转换成int型),可以实现对多种数据类型数组的排序,如利用下面的比较函数compar可实现对字符数组的排序:
int* compar(const void* a, const void* b)
{
return(*(char*)b - *(char*)a);
}
对double型数组排序:
int* compar(const void* a, const void* b)
{
return *(double*)b > *(double*)a ? 1:-1;
}
在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系。
返回值:
该函数会修改输入数组,但不会返回任何值。
举例1:对int型数组排序
#include <stdio.h>
#include <stdlib.h>
int values[] = { 88, 56, 100, 2, 25 };
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main()
{
int n;
qsort(values, 5, sizeof(int), cmpfunc);
printf("\n排序之后的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}
return(0);
}
举例2:对char型数组进行排序
int* cmp(const void* a, const void* b)
{
return(*(char*)a - *(char*)b);
}
int main() {
char a[] = "helloworld";
qsort(a, strlen(a), sizeof(char), cmp);
for (int i = 0; i < strlen(a); i++) {
printf("%c ", a[i]);
}
}