欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 深入浅出理解 C 语言中的 qsort 函数

深入浅出理解 C 语言中的 qsort 函数

2024/10/24 12:22:13 来源:https://blog.csdn.net/2302_81410974/article/details/140638178  浏览:    关键词:深入浅出理解 C 语言中的 qsort 函数

目录

引言

一、什么是qsort

二、函数原型 

1.qsort函数

 2.比较函数

三、qsort函数使用示例

1.使用qsort排序整形数据

 2.使用qsort排序结构数据

总结 


引言

在编程中,排序是一个常见且重要的操作。C 语言标准库提供了一系列排序函数,其中 qsort 函数是一个非常强大的工具。本文将深入浅出地介绍 qsort 函数的用法、原理,并通过实例展示如何在实际编程中使用它。

一、什么是qsort

qsort 是 C 标准库 <stdlib.h> 中提供的一个排序函数。它使用快速排序算法(Quick Sort)对数组进行排序。快速排序是一种高效的排序算法,由 Tony Hoare 在 1960 年发明,其平均时间复杂度为 O(n log n)。

 

二、函数原型 

1.qsort函数

qsort 函数原型

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

下面是 qsort 函数的参数说明

base:指向待排数组的第一个元素的指针
num:base指向的待排数组中元素的个数
size:base指向的待排数组中每个元素的大小,以字节为单位。
compar函数指针,指向的就是两个元素的比较函数,该函数用于确定排序的顺序。

 2.比较函数

qsort 函数使用了一个回调函数在计算机编程中,回调函数是一种作为参数传递给另一个函数的函数,以便在某个特定事件发生时由该函数调用。在 qsort 的上下文中,回调函数用于确定数组中元素的比较方式。

在 qsort 的定义中,int (*compar)(const void *, const void *) 是一个函数指针参数,它指向了一个比较函数。当 qsort 需要比较数组中的两个元素时,它会调用这个比较函数。比较函数的返回值决定了 qsort 如何重新排列数组中的元素。

比较函数的原型如下:

int compar(const void *a, const void *b);

这个函数需要返回以下三个值之一:

负值,如果参数 a 小于参数 b;
,如果参数 a 和 b 相等;
正值,如果参数 a 大于参数 b。

所以一般比较函数都这样写,这里以一个比较两个整形的函数为例:

int int_cmp(const void *a, const void *b);//写一个比较两个整数的函数为例
return (*( int *)p1 - *(int *) p2);//p1、p2强制类型转化成int*再解引用然后做差

三、qsort函数使用示例

1.使用qsort排序整形数据

#include <stdio.h>
//qosrt函数的使⽤者得实现⼀个⽐较函数
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
int main()
{int arr[] = { 9,7,5,3,1,8,6,4,2,0 };int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

运行结果如下:

 2.使用qsort排序结构数据

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
typedef struct Stu //学⽣ 
{char name[20];//名字int age;//年龄 
}Student;//typedef重定义类型名,Student就是这个结构体类型的别名
//假设按照年龄来⽐较--整形比较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((Student*)e1)->age - ((Student*)e2)->age;
}
//假设按照名字来⽐较--字符串比较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
}//strcmp是库函数,是专⻔⽤来⽐较两个字符串的比较大小(按字符串对应的字符的ASCII码进行比较)
//按照年龄来排序
void test_age(Student* s,int sz)//参数为结构体数组指针,数组长度
{qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);// 打印排序后的结构体数组printf("\n按年龄排序\n");for (int i = 0; i < sz; i++) {printf("%s is %d years old.\n", s[i].name, s[i].age);}
}
//按照名字来排序
void test_name(Student*s, int sz)//参数为结构体数组指针,数组长度
{qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);// 打印排序后的结构体数组printf("\n按名字排序\n");for (int i = 0; i < sz; i++) {printf("%s is %d years old.\n", s[i].name, s[i].age);}
}
int main()
{Student s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);test_age(s,sz);test_name(s,sz);return 0;
}

运行结果如下:

总结 

qsort 是 C 语言中一个强大且灵活的排序工具。通过提供自定义的比较函数,我们可以对各种数据类型的数组进行排序。掌握 qsort 的用法,可以让我们的编程工作更加高效。希望本文能够帮助你更好地理解和运用 qsort 函数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com