快排函数qsort的使用(c语言)

本文详细介绍了C语言标准库函数qsort的四个参数:元素起始地址、元素个数、元素大小和比较函数。通过实例演示了如何针对整型、字符、double类型以及结构体进行排序。
摘要由CSDN通过智能技术生成

qsort函数的参数及其含义

首先,qsort这个函数需要有四个参数.后面我用数组给大家举例
在这里插入图片描述
在这里插入图片描述

假设我们所要排序的是 int arr[] = { 9,8,7,6,5,4,3,2,1,0 };这样一个数组

qsort的四个参数

base:指向待排序的第一个元素的地址,也就是数组首元素的地址,我们把数组名传过去就行 (数组名在大多数情况下指的是数组首元素的地址)
num:表示你想要排序的元素个数,数组的元素个数(size_t是表示无符号整型,也就是只能为正) 用int sz = sizeof(arr)/sizeof(arr[0])算出.
size:表示元素的大小,单位是字节.(用**sizeof(arr[0])**就能知道)
*compa:compa是函数指针,指向一个函数,这个函数是用来比较两个元素的,而后面的两个const void 是指向要比较的两个元素的地址.

qsort最后一个参数–函数指针详解

排序整型数组时,我们可以使用< >符号来操作,但是排列字符串,结构体呢?
不同的类型有不同的排序方式,而我们需要将这个排序方式传给qsort函数.让它清楚应该怎么样排序.
在这里插入图片描述

比较两个整型的函数的声明int cmp_int(const void* e1, const void* e2)
当e1指向的元素大于e2指向的元素时,返回大于0的数
当e1指向的元素等于e2指向的元素时,返回0
当e1指向的元素小于e2指向的元素时,返回小于0的数

需要注意的是函数名就是函数的地址,所以在使用qsort时我们直接传 cmp_int

对函数参数组装

qsort(arr,sz,sizeof(arr[0],cmp_int)

为什么这个函数传参有那么多空指针呢?

char类型的地址有char来接收, int 类型的地址有int 来接收.
而qsort不知道我们要排序的元素是什么类型,void*本身就像一个垃圾桶,能存任何类型的地址.

切记:
void*不能进行解引用操作,也不能通过±整数来操作.(相当于一个被束缚的垃圾桶,只能丢垃圾)只能通过强转类型来解除束缚.

cplusplus网站关于qsort函数的解释
qsort的头文件是<stdlib.h>

qsort函数排序整型数组

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;//强转void*成int* 从小到大
	//return *(int*)e2 - *(int*)e1;// 从大到小
}
int main()
{
	int arr[] = { 1,6,2,3,5,10,4,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这里插入图片描述
double类型,char类型与int排序相似
char类型:

int cmp_char(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}

double类型:

int cmp_double(const void* e1, const void* e2)
{
	return *(double*)e1 - *(double*)e2;
}

字符串类型与上面有些不同


int cmp_string(const void* e1, const void* e2)
{
	return strcmp(*(char(*)[20])e1 ,*(char(*)[20])e2);
}

qsort排序结构体

用名字排序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct man {
	char name[20];
	int age;
};
int cmp_by_name(const void* e1, const void* e2)//用名字进行排序
{
	return strcmp(((struct man*)e1)->name, ((struct man*)e2)->name);
}
int main() 
{
	struct man arr[] = { {"zhangsan",16},{"lisi",36},{"wangwu",60},{"zhangfei",8} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_name);

	return 0;
}

排序前:
在这里插入图片描述
排序后:
在这里插入图片描述

用年龄排序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
struct man {
	char name[20];
	int age;
};

int cmp_by_age(const void* e1, const void* e2)//用年龄大小排序
{
	return ((struct man*)e1)->age - ((struct man*)e2)->age;
}
int main() 
{
	struct man arr[] = { {"zhangsan",16},{"lisi",36},{"wangwu",60},{"zhangfei",8} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_age);

	return 0;
}

排序前:
在这里插入图片描述

排序后:
在这里插入图片描述

总结

qsort快排函数需要四个参数,
1.voidbase:指明要排序的起始地址
2.size_t num:说明要排序的元素个数
3.size_t size:要排序的元素大小,比如int类型的大小是四个字节
4.int (compar)(const void,const void
):函数指针,定义这些元素要怎么进行比较

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海的宇宙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值