qsort()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中,可实现对多种数据结构的排序,其时间复杂度为 O(nlogn)。函数原型如下:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
这个函数需要四个参数。
第一个参数是需要排序的数组的基地址,因为是 void * 类型,所以此函数可以给任何类型的数组进行排序;
第二个参数是需要排序的元素数量(size_t 是一种特别的数据类型,可以近似理解为 int 型);
第三个是单个数组元素的大小,即字节数,例如 int 型就是 4 或者 sizeof(int) (sizeof 的返回值类型就是 sizeof),因为为了适用于各种数据结构,第一个参数将指向数组的指针强转成了 void * 类型,也即此时函数并不知道将要进行排序的数组内存储的是什么元素,因此我们需要显式地告诉它单个元素所占的长度;
第四个参数是一个指向函数的指针,其作用是规定排序的规则,即按照什么样的方式进行排序。
例子:
int compare(const void* a, const void* b) {
int a1 = *(int*)a, b1 = *(int*)b;
return a1 - b1;
}
bool core(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), compare);
for (int i = 0; i < numsSize - 1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
最重要的是第四个参数,比较函数的定义,qsort函数会依据你定义的比较函数返回值进行排序。
**如果想升序,就定义if(a<=b) return -1;
**如果想降序,就定义if(a>=b) return 1;
简化:if(*a<=*b)
return *a-*b;//升序,返回负数
if(*a>=*b)
return *a-*b;//降序,返回正数
附加:直接使用qsort函数进行排序一般比自己写的快速排序更快,因为在stdlib.h头文件中qsort已经被优化了很多遍,比如:到某一条件即跳出循环等判断减少了消耗。。。。所以,如果自己写的快排超时了,可以考虑使用提供的qsort函数或者更高效的排序算法。