今天主要学习了C语言中的排序API,Qsort()
本质上还是使用快速排序实现的;
具体使用方法:qsort(待排序数组, 数组长度, 每个元素字节长 sizeof(int), 比较函数)
比较函数决定当前排序是升序还是降序,传入两个参数,返回1则交换,-1和0则不交换
一般使用方法
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位整形):
int cmp(const void * p1, const void * p2) {
return (*(int *)p1) - (*(int *) p2);
}
912. 排序数组 - 力扣(LeetCode)
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)
// 比较函数
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)
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)
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)
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)
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;
}