深入解析C语言自带的比较函数与排序函数——fmax、qsort

我的所有学习笔记:GitHub - Dusongg/StudyNotes: C++11-20 、Linux进程/线程/内核设计/网络、进阶算法、java/python语法基础、Git、Mysql

 看完给个star再走吧⭐

目录

 一、 fmax函数

1. 解析fmax函数

2. 运用fmax函数

•小总结:

二、fdim函数

1.  解析fdim函数

2. 运用fdim函数

三、qsort函数💯

1. 解析qsort函数

2. 运用qsort函数 

3. 深入挖掘qsort 

4.qsort实战

 Summery💐💐💐


 一、 fmax函数

1. 解析fmax函数

fmax是C语言(C99)自带的一个函数,用于比较两数大小,返回较大值
在cplusplus网站上搜索fmax函数,了解更多信息icon-default.png?t=N7T8https://cplusplus.com/

famx返回值为双精度浮点型,同时可用fmaxf,fmaxl

2. 运用fmax函数

• 包含头文件:include<math.h>

#include<stdio.h>
#include<math.h>
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<stdio.h>
#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函数

1.  解析fdim函数

使用fdim函数判断传入的第一个参数(x)是否大于第二个参数(y)

如果x > y 则返回两者的差值( x - y ) 

如果 x < y 则返回 0 

2. 运用fdim函数

• 包含头文件:include<math.h>

#include <stdio.h>  
#include <math.h>  
     
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函数

1. 解析qsort函数

 调用qsort函数需要传入四个参数

① 待排序的数组首地址

② 数组元素的个数

③ 单个元素的大小(字节)

 ④ 实现一个比较函数(cmpare)

2. 运用qsort函数 

• 包含头文件:include<stdlib.h>

四个当中最重要的就是实现最后一个比较函数了,这也使我们唯一需要手动实现的东西:

这里给出一个简单的例子带大家初步熟悉⬇️

#include<stdio.h>
#include<stdlib.h>
//比较函数
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;
}

3. 深入挖掘qsort 

相信大家经过上面这个例子之后能够大概运用了,但是可能有同学会提问,为什么比较函数返回两者相减呢?

翻阅qsort函数原理,对于返回大于零的数字时(e1>e2) ,将较大值覆盖到较小值,最终实现排序的目的;

 qsort 函数实现了一种快速排序算法,用于对 num 元素数组进行排序,每个元素的宽度字节。参数基是指向要排序的数组基的指针。qsort 用排序的元素覆盖此数组。参数 compare 是指向用户提供的例程的指针,该例程比较两个数组元素并返回指定其关系的值。qsort 在排序过程中调用 COMPARE 例程一次或多次,每次调用时将指针传递给两个数组元素

如果想要得到倒序,直接将比较函数里两者相减的位置交换即可⬇️

 

4.qsort实战

剑指 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的文章


 Summery💐💐💐

上述这些函数都极大的减轻了我们的代码量,尤其时qsort函数,当我们在刷题时遇到需要我们进行排序之后再做的题,这时我们使用C语言内置的函数就方便很多了👌

当然,如果你想要知道更多排序算法,欢迎阅读我之前所写的

排序算法(一)icon-default.png?t=N7T8https://blog.csdn.net/Dusong_/article/details/127749130?spm=1001.2014.3001.5502
排序算法(二)icon-default.png?t=N7T8https://blog.csdn.net/Dusong_/article/details/127385058?spm=1001.2014.3001.5502更多C++函数

C++用于算法题中简化代码的冷门函数与类模板集合icon-default.png?t=N7T8https://blog.csdn.net/Dusong_/article/details/132536168?spm=1001.2014.3001.5502

  • 49
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dusong_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值