【C语言】qsort对各数据类型的排序

qsort函数的使用

www.cpluscplus.com打开链接查看qsort函数的定义。
在这里插入图片描述
1、现在我们来认识下这个函数,这个函数是对数组元素进行排序
void qsort (void* base, size_t num, size_t size,
int (compar)(const void,const void*));
(1)void* base:空指针指向数组的起始地址
(2)size_t num:要排序元素的个数,类型为无符号整形
(3)size_t size:要排序元素在内存中占多少个字节,无符号整形类型
(4)最后一个形式参数为函数指针,指向了一个函数,它有俩个参数都为常量空指针,返回类型为整形。函数的作用是为了比较排序数组中俩个元素的大小,如果要排序数组的类型是int型,则这个函数的目的就是实现比较俩个int型的大小,返回一个>0、<0、=0的结果。
2、大概了解了函数的意思,我们通过一个例子来用下这个qsort函数
下面展示将一个整形数组进行排序`。

#include <stdio.h>
//用qsort函数用相应的头文件
#include <stdlib.h>

void print(int arr[], int sz)
{
	int i = 0;
	for(i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
int cmp_int(const void* e1, const void* e2)
{
	//e1为void*指针,我们使用必须转化为int*
	return (*((int*)e1) - *((int*)e2));
}
int main()
{
	//定义一个要排序的整形数组
	int arr[] = {9,8,7,6,5,4,3,2,1};
	int sz = sizeof(arr)/sizeof(arr[0]);//39/4
	//打印数组
	printf("排序之前:\n");
	print(arr,sz);
	//用qsort进行排序
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//打印数组
	printf("排序之后:\n");
	print(arr,sz);
	
	return 0;
}

3、最近在练习一个通讯录的代码,里面有一个排序的功能。接下来我们来看一个对结构体类型的排序
下面展示一些 内联代码片

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
//引入qsort函数的头文件
#include <stdlib.h>

//自定义一个结构体类型存放个人信息
typedef struct PeoInfo
{
	char name[10];
	int age;
}PeoInfo;
void print(PeoInfo* data, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s  ",data[i].name);
		printf("%d\n", data[i].age);
	}
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp((*(PeoInfo*)e1).name, (*(PeoInfo*)e2).name);
}
int cmp_age(const void* e1, const void* e2)
{
	return (*(PeoInfo*)e1).age - (*(PeoInfo*)e2).age;
}
//对结构体类型进行排序
int main()
{
	//初始化个人信息
	PeoInfo data[3] = {"zhangsan",15,"wangwu",10,"lisi",5};
	int sz = sizeof(data)/sizeof(data[0]);
	//打印信息
	printf("原始信息:\n");
	print(data, sz);
	printf("按姓名排序:\n");
	qsort(data, sz, sizeof(data[0]), cmp_name);
	print(data, sz);
	printf("按年龄排序:\n");
	qsort(data, sz, sizeof(data[0]), cmp_age);
	print(data, sz);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值