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

目录

 一、 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函数,了解更多信息https://cplusplus.com/

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第1张图片

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

2. 运用fmax函数

• 包含头文件: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;
}

运行结果:

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第2张图片

 同样可以宏定义一个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函数

1.  解析fdim函数

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第3张图片

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

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

如果 x < y 则返回 0 

2. 运用fdim函数

• 包含头文件: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;
}

运行结果:

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第4张图片

三、qsort函数

1. 解析qsort函数

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第5张图片

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

① 待排序的数组首地址

② 数组元素的个数

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第6张图片

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

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

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第7张图片

2. 运用qsort函数 

• 包含头文件: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;
}

3. 深入挖掘qsort 

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

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第8张图片

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

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

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第9张图片

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

深入解析C语言自带的比较函数与排序函数——fmax、qsort_第10张图片 

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语言内置的函数就方便很多了

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

排序算法(一)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

你可能感兴趣的:(C语言,c语言)