原来还有【快速排序】 qsort() 函数

2024 - 10 - 01 - 笔记 - 20
作者(Author): 郑龙浩 / 仟濹(网名)

qsort()函数

① 介绍:

包含头:#include <stdlib.h>

C语言本身提供的一个函数。

qsort函数是使用【快速排序】思想实现的一个排序函数

qsort函数可以排序任意类型的数据

提示:可以使用MSDN软件搜索此函数

注:类型是const void 的指针elem

  • elem不可以改变指向的变量的值
  • void 的指针elme可以指向任意类型的变量
  • viod 的指针elme是不能直接进行解引用的操作的
  • elme 不可以进行解引用操作,也不能进行+-整数操作
c 复制代码
void qsort( void *base, //指针 - 要排序的数据的起始位置
           size_t num, //整型 - 待排序的数据元素的个数
           size_t width, //整型 - 待排序的数据元素的大小(占了几个字节)
           int (__cdecl *compare )(const void *elem1, const void *elem2 ) );//函数指针 - 比较函数 - 存放比较函数的地址,说白了就是根据我提供的函数进行比较。
//elem1 与 elem2 是要比较的两个元素的地址
//之前一直疑惑为什么只有两个元素进行比较
//其实还需要自己写一个函数,里面有两个参数,然后自己定义如何比较这两个数据
c 复制代码
_cdecl - 函数调用约定 - 约定了函数按照C的形式去调用//可以删掉_cdecl
//单词:
base - 库
num - 数字
width - 宽度
compare - 比较
elem - 元素、基本的

② qsort函数 排序【整型数据】:

平时所联系的多数也是整数比较

注意:在定义判断函数的时候,返回值必须得有大于0、小于0、等于0三种情况(包括1, 0, -1)

c 复制代码
//先将表示比较规则的函数写出来
int compare_int(const void* elem1, const void* elem2)//有规定,返回值必须是>0,==0,<0这三个
{
    //这尽量就不要些if比较谁大谁小了,看起来非常的不方便
    
    return (*(int*)elem1 - *(int*)elem2);//返回>0 ==0 <0
    //判断函数必须返回返回>0 ==0 <0 这三种情况,或者1,0,-1也可以
    //切记:千万不可*elem1,因为void的指针不可直接解引用,必须将指针强制类型转换以后才可进行解引用
}
int main()
{
    int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    qsort( arr, 10, sizeof( arr[0] ), compare_int  );
}

③ qsort排序 【结构体数据】

结构体的比较

c 复制代码
int compare_Stu_Name(const void* elem1, const void* elem2);
int compare_Stu_Age(const void* elem1, const void* elem2);
    
int struct Student
{
    char[20] = "aaa";
    int age;
}
int main()
{
    struct Stu student[] = { { "aaa", 10 }, { "bbb", 11 }, { "ccc", 12 }, { "ddddd", 13 }, { "eeeeee", 14 } };
    //按姓名排序
	qsort( student, 5, sizeof( student[0] ), compare_Stu_Name );
    //按年龄排序
	qsort( student, 5, sizeof( student[0] ), compare_Stu_Age );
    
}



//写比较结构体中姓名成员的规则
int compare_Stu_Name(const void* elem1, const void* elem2)
{
    //强制类型转换:将无类型的指针强制转换为 struct Stu 类型
    strcmp( ((struct Stu*)elem1) -> name, ((struct Stu*)elem2) -> name )//只返回三种情况
}
//写比较结构体中年龄成员的规则
int compare_Stu_Age(const void* elem1, const void* elem2)
{
	return (struct Stu*)elem1 - (struct Stu*)elem2);//只返回三种情况
}
相关推荐
钱钱钱端5 分钟前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
慕卿扬6 分钟前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
Json____12 分钟前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
斌斌_____13 分钟前
通过反射机制,比较两个对象的字段值的差异
java
WZF-Sang13 分钟前
Linux—进程学习-01
linux·服务器·数据库·学习·操作系统·vim·进程
幼儿园园霸柒柒16 分钟前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
cooldream200917 分钟前
Spring Boot中集成MyBatis操作数据库详细教程
java·数据库·spring boot·mybatis
阑梦清川26 分钟前
JavaEE进阶---第一个SprintBoot项目创建过程&&&我的感受
java·java-ee·springboot
程序员清风31 分钟前
浅析Web实时通信技术!
java·后端·面试
好想有猫猫35 分钟前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节