手撕qsort函数

前言

本篇主要讲解的是qsort函数细节以及运用实例。

紧跟我的脚步一起手撕qsort函数吧~

欢迎关注​​个人主页:逸狼

更多优质内容:

拿捏c语言指针(上)

拿捏c语言指针(中)

拿捏c语言指针(下)


创造不易,可以点点赞吗~

如有错误,欢迎指出~



qsort函数介绍

qsort 函数可以实现任意数据的排序

他的底层排序算法是快速排序,对应的头文件是string.h

我们在官网cplusplus中搜索 qsort函数 得到如图 参数 和 compar函数的返回值


参数解释

base

void* base

base指向要排序数组的第一个元素(起始位置),void* 是为了接收不同类型的数据

num

num 的返回类型是size_t

base指向的数组的元素个数(待排序的数组的元素个数)

size

size 的返回类型是size_t

base指向的数组的元素的大小(单位是字节)

compar

int (*compar)(const void*p1, const void*p2))函数的返回类型是int ,他有两个参数分别是const void*p1const void*p2,void* 是为了接收不同类型的数据,return 返回时要 强制类型转化被比较的数据的类型。

(*compar)是函数指针 ,该指针指向的函数 是用来比较数组中的2个元素的,p1和p2分别指向两个不同的元素

compar函数是根据实际要比较的数据自己写的

应用qsort实现排序整形

利用qsort实现排序整形数组

复制代码
//利用qsort实现排序整形数组
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void*p1,const void *p2)
{
	return *(int*)p1 - *(int*)p2;//(int*)是强制类型转换为int*类型
}
int main()
{
	int arr[10] = { 9,4,6,1,0,3,7,2,5,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//排序前打印
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//排序后打印
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

代码结果

应用qsort实现排序结构体

排年龄

将年龄排成升序

复制代码
//利用qsort实现排序结构体数据
#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
struct Stu
{
	char name[20];//名字
	int age;//年龄
};
//不能直接使用< > ==比较
//
//1.按照年龄比较
int cmp_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age -((struct Stu*)p2)->age;
	//      (struct Stu*)代表将p1和p1强制类型转化为结构体指针类型
}
void test()
{
	struct Stu arr[] = { {"zs",66},{"ls",18},{"ww",35} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_age);
}

int main()
{
	//年龄排成升序
	test();
	return 0;
}

调试结果

未排序前


排序完成


排名字

将名字排成升序

复制代码
//2.按照名字比较
int cmp_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name);
	//      (struct Stu*)代表将p1和p1强制类型转化为结构体指针类型
}
void test()
{
	struct Stu arr[] = { {"zhangsan",66},{"lisi",18},{"wangwu",35} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_name);
}


int main()
{
	//名字排成升序
	test();
	return 0;
}

库函数strcmp

其中,比较名字(实际上是比字符串大小)

这里需要运用库函数strcmp(对应的头文件是string.h) 比较字符串大小(是按照对应位置上字符的ASCII值的大小比较的)

strcmp的返回值 与qsort函数的返回值一致


调试结果

相关推荐
CQU_JIAKE5 分钟前
8.23【A】
算法
sprlightning16 分钟前
LHDC V5 算法深度解析
算法·fft·lhdcv5·imdct·mdct·rice·fac
csdn_aspnet1 小时前
C# 第k个最小元素(K’th Smallest Element)
算法·c#·排序算法
BioRunYiXue1 小时前
RACE技术全攻略:从全长克隆到靶基因验证
java·javascript·网络·人工智能·科技·算法·eclipse
ZPC82101 小时前
joy 及sensor_msgs
算法
Three_ST1 小时前
沐神-动手学习深度学习-习题答案4.4模型选择,欠拟合,过拟合
人工智能·python·深度学习·学习·算法
CIO_Alliance1 小时前
AI深度系列(2)| CNN卷积池化感受野原理:从局部感知到全局视野
人工智能·深度学习·线性代数·算法·计算机视觉·企业ai转型·企业cio联盟
探物 AI2 小时前
机器人清理墙角蜘蛛网,背后需要哪些算法?——从视觉分割到贴墙力控
算法·机器人
青 春 记 忆2 小时前
LeetCode 226. 翻转二叉树|Python 解法详解
python·算法·leetcode
民乐团扒谱机2 小时前
【微科普】压缩感知(CS):违反了奈奎斯特采样定理?不先采集也能还原信号?大白话讲透稀疏采样、L1重建与OMP,一文吃透附代码
python·神经网络·线性代数·算法·数学建模·压缩感知·奈奎斯特