【九日集训】第五天:排序

今天主要学习了C语言中的排序API,Qsort()本质上还是使用快速排序实现的;

具体使用方法:qsort(待排序数组, 数组长度, 每个元素字节长 sizeof(int), 比较函数)

比较函数

比较函数决定当前排序是升序还是降序,传入两个参数,返回1则交换,-1和0则不交换

一般使用方法

C 复制代码
int cmp(const void*p1, const void*p2) {
    int v1 = *(int *) p1;
    int v2 = *(int *) p2;
    if(v1 > v2) {
        return 1;
    }else if(v1 < v2) {
        return -1;
    }
    return 0;
}

简化写法(可以确保数组数据相减不超过32位整形):

c 复制代码
int cmp(const void * p1, const void * p2) {
	return (*(int *)p1) - (*(int *) p2);
}

第一题

912. 排序数组 - 力扣(LeetCode)

c 复制代码
int cmp(const void*p1, const void*p2) {
    int v1 = *(int *) p1;
    int v2 = *(int *) p2;
    if(v1 > v2) {
        return 1;
    }else if(v1 < v2) {
        return -1;
    }
    return 0;
}

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

使用排序函数即可,记得设置返回长度参数.

第二题

169. 多数元素 - 力扣(LeetCode)

c 复制代码
// 比较函数
int cmp(const void *p1, const void *p2) {
    return (*(int *)p1) - (*(int *)p2);
}

int majorityElement(int* nums, int numsSize) {
    if(numsSize == 1) return nums[0]; //如果有一个元素则返回
    qsort(nums, numsSize, sizeof(int), cmp);  //排序
    int maxNum = 0, temp = 1;
    int res;  
    // 遍历数组,相同的数必然在一起,计数最大的返回
    for(int i = 1; i < numsSize; i++) {
        if(nums[i] == nums[i - 1]) {
            temp++;
        }else {
            temp = 1;
        }
        if(temp > maxNum) {
            maxNum = temp;
            res = nums[i];
        }
    }
    return res;
}

第三题

217. 存在重复元素 - 力扣(LeetCode)

c 复制代码
int cmp(const void *p1, const void *p2) {
    int v1 = *(int *) p1;
    int v2 = *(int *) p2;
    return v1 - v2;
}

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;
}

第四题

164. 最大间距 - 力扣(LeetCode)

c 复制代码
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 maxgap = 0;
    for(int i = 0; i < numsSize - 1; i++) {
        if(nums[i + 1] - nums[i] > maxgap) {
            maxgap = nums[i + 1] - nums[i];
        }
    }
    return maxgap;
}

第五题

905. 按奇偶排序数组 - 力扣(LeetCode)

c 复制代码
int cmp(const void * p1, const void * p2) {
    return (*(int *) p1) & 1 - (*(int *)p2) & 1;
}

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

将函数条件改一下即可,偶数放到前面,奇数放到后面

第六题

539. 最小时间差 - 力扣(LeetCode)

c 复制代码
int cmp(const void *p1, const void *p2) {
    return (*(int *) p1) - (* (int *) p2);
}

int min(int a, int b) {
    return a > b ? b : a;
}

int findMinDifference(char ** timePoints, int timePointsSize){
    int *res = (int *)malloc(sizeof(int) * timePointsSize);
    int ans = 1440;
    int a,b;
    for(int i = 0; i < timePointsSize; i++) {
        sscanf(timePoints[i], "%d:%d", &a, &b);
        res[i] = a * 60 + b;
    }

    qsort(res, timePointsSize, sizeof(int), cmp);  //排序数字数组   

    for(int i = 1; i < timePointsSize; i++) {
        if(res[i] - res[i - 1] < ans) {
            ans = res[i] - res[i - 1];
        }
    }
    ans = min(ans, res[0] - res[timePointsSize - 1] + 1440);
    return ans;
}
相关推荐
Blossom.11839 分钟前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算
A林玖43 分钟前
【机器学习】朴素贝叶斯
人工智能·算法·机器学习
六边形战士DONK1 小时前
神经网络基础[损失函数,bp算法,梯度下降算法 ]
人工智能·神经网络·算法
wuqingshun3141591 小时前
蓝桥杯 2. 确定字符串是否是另一个的排列
数据结构·c++·算法·职场和发展·蓝桥杯
小刘|1 小时前
JVM 自动内存管理
java·jvm·算法
小羊不会c++吗(黑客小羊)2 小时前
c++头文件知识
算法
拓端研究室TRL2 小时前
PyMC+AI提示词贝叶斯项目反应IRT理论Rasch分析篮球比赛官方数据:球员能力与位置层级结构研究
大数据·人工智能·python·算法·机器学习
长沙火山2 小时前
9.ArkUI List的介绍和使用
数据结构·windows·list
CoovallyAIHub3 小时前
Vision Transformers与卷积神经网络详细训练对比(附代码)
深度学习·算法·计算机视觉
地平线开发者3 小时前
征程 6 逆向自证hbm与bc一致性
算法·自动驾驶