首页 > 其他分享 >【C语言入门】快速排序函数的应用

【C语言入门】快速排序函数的应用

时间:2023-10-06 13:06:08浏览次数:43  
标签:p2 p1 const 入门 nums int C语言 排序 cmp

快速排序函数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;
}

标签:p2,p1,const,入门,nums,int,C语言,排序,cmp
From: https://blog.51cto.com/u_16188762/7723084

相关文章

  • SpringMVC入门demo
    工作流程demo使用:配置文件配置DispatcherServlet<?xmlversion="1.0"encoding="UTF-8"?><!--更新版本为4.0--><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/j......
  • 求最大公约数的三种方法:C语言
    求最大公约数之穷举法求最大公约数之穷举法inta,b,c,gcd;scanf("%d%d",&a,&b);c=a<b?a:b;inti=1;for(i=c;i>=1;i--){if(a%i==0&&b%i==0){gcd=i;printf("GCD=%d\n",gcd);......
  • sv的LSB 使用+SV的protect类型+RAL模型的lock原因+C语言结构体中的冒号用法+uvm版本在
    sv的LSB使用https://blog.csdn.net/gsjthxy/article/details/90722378等价关系[LSB+:STEP]=[LSB+STEP:LSB]伪代码:bit[1023:0]mem;bit[7:0]data;j=0..100mem[j*8+:8]=data;//[7:0],[15:8],[23:16]SV的protect类型https://blog.csdn.net/qq_37573794/ar......
  • 为什么处理已排序数组比处理未排序数组更快?
    在这个C++代码中,在计时区域之前对数据进行排序(*)使得主循环快6倍:#include<algorithm>#include<ctime>#include<iostream>intmain(){//生成数据constunsignedarraySize=32768;intdata[arraySize];for(unsignedc=0;c<arraySize;++c)......
  • 常见的C语言执行效率优化方法
    C语言之心效率优化写代码时考虑代码的执行效率是一个好习惯,嵌入式开发多年,让自己养成了这样的习惯。优化C语言代码的执行效率是一项重要的任务,可以通过多种方法和注意事项来实现。下面列出了一些常用的方法和注意事项,并结合具体实例进行详细讲解:选择合适的数据结构使用合适的数......
  • Linux系统中驱动入门设备树DTS(经典)
    设备树(DTS:devicetreesource),字面意思就是一块电路板上设备如上图中CPU、DDR、I2C、GPIO、SPI等,按照树形结构描绘成的一棵树。按照策略和功能分离的思路,就是驱动代码(功能)和设备树DTS配置文件(策略)分开来进行设计,这样针对不同的电路板,Linux驱动代码就不用动了,只需要改改DTS就可以,DTS......
  • C语言逗号表达式和赋值表达式
    C语言逗号表达式和赋值表达式笔试常考这个,没办法#include<iostream>usingnamespacestd;intmain(intargc,charconst*argv[]){inta=0,b=0,c=0,d=0;//1.逗号表达式/*表达式1,表达式2,表达式3……表达式n;逗号表达式的求解过程是......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务11.c1#include<stdio.h>23intmain()4{5printf("o\n");6printf("<H>\n");7printf("II\n");89return0;10}1-1.c1#include<stdio.h>23in......
  • C语言:‘for‘ loop initial declarations are only allowed in C99 mode
    求最大公约数之穷举法mistake: because: 只允许在C99模式下使用‘for’循环初始化声明  solution:不在for()中初始化生命变量 ......
  • 数据结构入门 — 队列
    本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。博客主页:DuckBro博客主页系列专栏:数据结构专栏关注博主,后期持续更新系列文章......