目录
一、 fmax函数
1. 解析fmax函数
2. 运用fmax函数
•小总结:
二、fdim函数
1. 解析fdim函数
2. 运用fdim函数
三、qsort函数
1. 解析qsort函数
2. 运用qsort函数
3. 深入挖掘qsort
4.qsort实战
Summery
fmax是C语言(C99)自带的一个函数,用于比较两数大小,返回较大值
在cplusplus网站上搜索fmax函数,了解更多信息https://cplusplus.com/
famx返回值为双精度浮点型,同时可用fmaxf,fmaxl
• 包含头文件:include
#include
#include
int main()
{
printf("fmax (100.0, 1.0) = %f\n", fmax(100.0, 1.0));
printf("fmax (-100.0, 1.0) = %f\n", fmax(-100.0, 1.0));
printf("fmax (-100.0, -1.0) = %f\n", fmax(-100.0, -1.0));
return 0;
}
运行结果:
同样可以宏定义一个max达到与fmax函数同样的效果:
#include
#define max(x,y) (x) > (y) ? (x) : (y)
int main()
{
printf("max (100.0, 1.0) = %f\n", max(100.0, 1.0));
printf("max (-100.0, 1.0) = %f\n", max(-100.0, 1.0));
printf("max (-100.0, -1.0) = %f\n", max(-100.0, -1.0));
return 0;
}
运行结果与使用fmax函数的结果是一样的;
在之前的文章中解决实际题目时我也是主要运用宏定义的方法,写这些东西主要是想表达fmax使用起来比宏定义一个max要方便很多,至少在敲代码上简便
fmin函数与fmax用法是完全相同的,只是返回值是较小值,大家可自行尝试
使用fdim函数判断传入的第一个参数(x)是否大于第二个参数(y)
如果x > y 则返回两者的差值( x - y )
如果 x < y 则返回 0
• 包含头文件:include
#include
#include
int main ()
{
printf ("fdim (2.0, 1.0) = %f\n", fdim(2.0,1.0));
printf ("fdim (1.0, 2.0) = %f\n", fdim(1.0,2.0));
printf ("fdim (-2.0, -1.0) = %f\n", fdim(-2.0,-1.0));
printf ("fdim (-1.0, -2.0) = %f\n", fdim(-1.0,-2.0));
return 0;
}
运行结果:
调用qsort函数需要传入四个参数:
① 待排序的数组首地址
② 数组元素的个数
③ 单个元素的大小(字节)
④ 实现一个比较函数(cmpare)
• 包含头文件:include
四个当中最重要的就是实现最后一个比较函数了,这也使我们唯一需要手动实现的东西:
这里给出一个简单的例子带大家初步熟悉⬇️
#include
#include
//比较函数
int cmp_int(int* e1,int* e2) //数组元素为整型,所以用整型指针接收
{
return *e1 - *e2; //具体原理看后图
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int size = sizeof(arr) / sizeof(arr[0]); //计算数组元素个数
qsort(arr, size,sizeof(arr[0]), cmp_int); //sizeof(arr[0])表示一个元素的大小:4bite
//打印数组
for (int i = 0; i < size; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
相信大家经过上面这个例子之后能够大概运用了,但是可能有同学会提问,为什么比较函数返回两者相减呢?
翻阅qsort函数原理,对于返回大于零的数字时(e1>e2) ,将较大值覆盖到较小值,最终实现排序的目的;
qsort 函数实现了一种快速排序算法,用于对 num 元素数组进行排序,每个元素的宽度字节。参数基是指向要排序的数组基的指针。qsort 用排序的元素覆盖此数组。参数 compare 是指向用户提供的例程的指针,该例程比较两个数组元素并返回指定其关系的值。qsort 在排序过程中调用 COMPARE 例程一次或多次,每次调用时将指针传递给两个数组元素
如果想要得到倒序,直接将比较函数里两者相减的位置交换即可⬇️
剑指 Offer 39. 数组中出现次数超过一半的数字
leetcode传送➡️https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/?favorite=xb9nqhhg
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2
完整代码:
int cmp(int* x, int* y)
{
return *x - *y;
}
int majorityElement(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), cmp);
return nums[numsSize / 2];
}
用排序知识这道题的一种做法,这道题有O(n)的做法,这里就不再赘述了 ,之后有时间我会专门出一期剑指offer的文章
上述这些函数都极大的减轻了我们的代码量,尤其时qsort函数,当我们在刷题时遇到需要我们进行排序之后再做的题,这时我们使用C语言内置的函数就方便很多了
当然,如果你想要知道更多排序算法,欢迎阅读我之前所写的
排序算法(一)https://blog.csdn.net/Dusong_/article/details/127749130?spm=1001.2014.3001.5502
排序算法(二)https://blog.csdn.net/Dusong_/article/details/127385058?spm=1001.2014.3001.5502