快速排序函数qsort

void qsort(void* base, type nitems, type size, int (cmp) (const void* p1,const void* p2));

参数说明:

base    指针要排序的数组的首元素指针

nitems    数组元素的总个数

size    数组中每一个元素的字节大小

cmp    函数指针(用来比较两个元素的函数)

比较函数cmp

int (cmp) (const void *p1,const void*p2)

参数说明:

cmp的返回值小于0,p1会排在p2的左边,即升序

cmp的返回值大于0,p1会排在p2的右边,即降序

cmp的返回值等于0,p1和p2的顺序不确定

实战

【例题1】912. 排序数组 - 力扣(LeetCode)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int cmp(const void* p1,const void* p2){
   return *(int*)p1-*(int*)p2;
 }
int* sortArray(int* nums, int numsSize, int* returnSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    *returnSize = numsSize;
    return nums;
}

【例题2】169. 多数元素 - 力扣(LeetCode)

int cmp(const int* p1,const int* p2){
    return *(int*)p1 - *(int*)p2;
}

int majorityElement(int* nums, int numsSize){
    // 出现次数大n/2
    qsort(nums,numsSize,sizeof(int),cmp);
    return nums[(numsSize-1)>>1];
}

【例题3】217. 存在重复元素 - 力扣(LeetCode)

int cmp (const int *p1,const int *p2){
    return *(int*)p1 - *(int*)p2;
}

bool containsDuplicate(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    for(int i=1;i<numsSize;i++){
        if (nums[i] == nums[i-1]){
            return true;
        }
    }
    return false;
}

【例题4】164. 最大间距 - 力扣(LeetCode)

int cmp(const void* p1,const void* p2){
    return *(int*)p1 - *(int*)p2;
}

int maximumGap(int* nums, int numsSize){
    if(numsSize<2) return 0;
    qsort(nums,numsSize,sizeof(int),cmp);
    int max = 0;
    for(int i=1;i<numsSize;i++){
        max = nums[i] - nums[i-1] > max ?  nums[i] - nums[i-1] : max;
    }
    return max;
}

【例题5】905. 按奇偶排序数组 - 力扣(LeetCode)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int judge (int value){
    return value%2;
}

int cmp(const void* p1,const void* p2){
    return judge(*(int*)p1) - judge(*(int*)p2);
}

int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    *returnSize = numsSize;
    return nums;
}

【例题6】539. 最小时间差 - 力扣(LeetCode)

int cmp(const void* p1,const void* p2){
    return *(int*)p1 - *(int*)p2;
}

int findMinDifference(char ** timePoints, int timePointsSize){
    int nums[timePointsSize];
    int h,m,min=INT_MAX;int i;
    for(i=0;i<timePointsSize;i++){
        sscanf(timePoints[i], "%2d:%2d",&h,&m);
        nums[i] = h*60 +m;
    }
    qsort(nums,timePointsSize,sizeof(int),cmp);
    for(i=1;i<timePointsSize;i++){
        min = min < nums[i] - nums[i-1] ? min : nums[i] - nums[i-1];
    }
    min = min < 24*60 + nums[0]- nums[i-1]? min :24*60 + nums[0] - nums[i-1];
    return min;
}