C语言qort函数
排序
int cmp(const void* _a, const void* _b){
int a = *(int *)_a, b = *(int *)_b;
return a-b;
}
bool containsDuplicate(int* nums, int numsSize) {
qsort(nums,numsSize,sizeof(int),cmp);
for(int i = 0; i< numsSize - 1; ++i){
if(nums[i] == nums[i+1]){
return true;
}
}
return false;
}
在这段代码中,cmp
函数的参数 _a
和 _b
是 qsort
函数所要求的比较函数的形式参数。qsort
函数在排序过程中会多次调用比较函数来比较数组中的元素。
const void*
是一个指向任意类型常量的指针。它表示 _a
和 _b
可以指向任何类型的常量数据,但在比较函数内部,需要通过类型转换将它们转换为适当的类型以进行实际的比较操作。
在 cmp
函数中,将 _a
和 _b
分别转换为 int*
类型的指针,然后通过解引用操作 *
获取它们所指向的整数值。这样做是因为 qsort
函数需要传递指向元素的指针,并且通过解引用操作来获取实际的元素值进行比较。
因为 qsort
函数需要通用的比较函数,所以它的参数类型是 const void*
,这样可以适应不同类型的数据。在实际使用时,需要根据实际的数据类型进行类型转换,并在比较函数内部按照相应的类型进行比较。
对于结构体:
typedef struct record{
int data;
int index;
}record;
int cmp(const void *_a, const void *_b){
record *a = (record*)_a;
record *b = (record*)_b;
return a->data - b->data;
}