C语言题目 - 调用qsort函数对数组进行排序

题目

如题

思路

其实没什么难的,只要严格按照 qsort 函数的参数来填充即可,这里要用到函数指针

qsort 函数的原型如下:

void qsort(void *base, size_t nitems, size_t size,
int (*compar)(const void *, const void *));

参数说明:

base :指向需要排序的数组的指针,数组中每个元素的大小应为 size 字节。
nitems :数组中的元素个数。
size :每个元素的大小(以字节为单位)。
compar:指向一个比较函数的指针。该函数用于比较两个元素的大小关系。

代码

c 复制代码
#include<stdio.h>
#include<stdlib.h>

//比较函数,也是qsort函数需要的指针参数指向的函数
int compare(const void * a, const void * b);

int main()
{
	int sz[5] = {1,5,2,6,4};//待排序的数组
    int (*compar)(const void *, const void *);//函数指针compar
	int * ps = sz;//指针指向sz数组
	int i;

	compar = compare;//指针指向compare函数

	qsort(ps, 5, 4, compar);//调用 qsort 函数

	for (i=0;i<5;i++)
	{
		printf("%d ",sz[i]);
	}//打印排序结果

	return 0;
}

int compare(const void * a, const void * b)
{
	int num1 = *(const int *)a;//void转换类型后才能使用
	int num2 = *(const int *)b;

	if (num1 > num2)
	{
		return 1;
	}

	if (num1 < num2)
	{
		return -1;
	}

	if (num1 == num2)
	{
		return 0;
	}
}

感悟

  • 要注意调用一个函数一定要严格按照它参数的函数类型来填充参数,比如说这里 qsort 函数的一个参数是 int (*compar)(const void *, const void *) ,那么这个参数是函数指针,函数指针的类型 int ,以及它的参数类型是 const void * ,这两个类型是一点都不能变的。但是在填充函数指针这个参数的时候可以选择填充 函数指针名函数名 ,因为当函数指针指向一个函数以后,这个函数指针名函数名 就可以互换使用了(只是用法差不多)。
  • 详细理解了 void * 类型的变量怎么使用:比如这里想把把它作为一个比较函数的参数使用,而且我想的是这两个数是 int 类型的,但有一点是 void * 类型的变量不转换类型是无法使用的,所以我要把 void * 类型的变量转换为 int 类型的变量:int num = *(const void *) a;
  • 首先,这个程序最后写的 compare 函数参数的意义是指向数组元素的指针,然后这个函数可以进行简化,让程序来判断元素大小:
c 复制代码
int compare(const void * a, const void * b)
{
	return (*(const int *)a - *(const int *)b);
}
相关推荐
liuyao_xianhui3 分钟前
优选算法_最小基因变化_bfs_C++
java·开发语言·数据结构·c++·算法·哈希算法·宽度优先
AI+程序员在路上12 分钟前
Linux C 条件变量阻塞线程用法:等待时CPU占用率为0
linux·运维·c语言
jimy116 分钟前
C语言实现-----面向对象编程
c语言·数据结构
黎阳之光21 分钟前
数智技术如何赋能空天地一体化,领跑低空经济新赛道
大数据·人工智能·算法·安全·数字孪生
不爱吃糖的程序媛28 分钟前
鸿蒙PC tiny-AES-c三方库适配实践
c语言·华为·harmonyos
HABuo29 分钟前
【linux线程(三)】生产者消费者模型(条件变量阻塞队列版本、信号量环形队列版本)详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
bestblueheart1 小时前
C语言怎么学?系统学习路线图分享
c语言·指针·计算机基础·学习路线·编程思想
小肝一下1 小时前
每日两道力扣,day2
c++·算法·leetcode·职场和发展
漂流瓶jz1 小时前
UVA-11846 找座位 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·排序算法·深度优先·aoapc·算法竞赛入门经典·uva
米粒12 小时前
力扣算法刷题 Day 31 (贪心总结)
算法·leetcode·职场和发展