【C语言】qsort()函数详解

简介: 【C语言】qsort()函数详解

1、qsort概念介绍

qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。


2、qsort()函数实现(循序渐进式讲解)

2.1 qsort()函数

qsort()函数函数函数参数:

void qsort 
(void* base //待排序数据的起始地址
 size_t num, //待排序数据的元素个数
 size_t size,//待排序数据中一个元素的大小(单位:字节)
 int (*compar)(const void*,const void*)//比较两个元素大小的函数指针
);


函数中第一个函数参数(void)的类型非常奇妙,因为待排序数据的元素类型可能是整形、浮点型、字符型、结构体……而void类型就像一个宰相(宰相肚子能撑船)不管你传过来的地址是何类型,我都可以积极的收纳。


       函数中第四个函数参数是最难理解的。对于整形数据我们可以通过大小号来比较,对于字符型数据可以用strcmp来比较,但是,我们遇到结构体就出现了问题,结构体中包含的类型多,我们就需要因材施教。

 int (*compar)(const void*p1,const void*p2)//比较两个元素大小的函数指针
);


微信截图_20230707131620.png


2.2 qsort()函数实现过程

观察冒牌排序:


 

可得出如下过程:

整形:

//测试qsort()函数功能
int cmp_int(const void* e1, const void* e2)
{
  return  *(int*)e1 - *(int*)e2;
}
void test()
{
  int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, sz, sizeof(arr[0]), cmp_int);
  for (int i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);//打印排列好的数组
  }
}
int main()
{
  test();
  return 0;
}


结构体:


struct Stu
{
  char name[20] = {0};
  int age = 0;
};
int cmp_by_name(const void* e1, const void* e2)
{
  return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test()
{
  struct Stu s[] = { {"zhangsan",10},{"lishi",20}};
  qsort(s, sizeof(s), sizeof(s->name),cmp_by_name);
  printf("%s ", s->name);
}
int main()
{
  test();
  return 0;
}


3、小节

       有了qsort()函数能有节省不少时间,后期我会出一起通讯录再详细的介绍qsort()函数的使用。

相关文章
|
5天前
|
存储 C语言
向函数传递结构体: C语言中的结构体参数传递详解
向函数传递结构体: C语言中的结构体参数传递详解
18 0
|
5天前
|
C语言
C语言中返回指针值的函数
C语言中返回指针值的函数
14 0
|
1天前
|
C语言
malloc()函数
`malloc()`是C语言中的动态内存分配函数,用于分配指定大小的内存块,并返回一个`void*`类型的指针。要包含`stdlib.h`头文件来使用它。分配的内存大小以字节为单位,成功则返回内存首地址,失败则返回`NULL`。需要注意的是,返回的指针需强制转换为所需类型,并在使用后用`free()`释放内存,避免内存泄漏。切勿在分配区域内移动指针,以防止释放时出现问题。
|
3天前
|
Serverless C语言
C语言函数详解与实战应用
C语言函数详解与实战应用
8 1
|
3天前
|
算法 C语言
C语言函数递归调用详解与实战应用
C语言函数递归调用详解与实战应用
11 0
|
3天前
|
C语言
C语言函数的嵌套调用详解
C语言函数的嵌套调用详解
9 1
|
5天前
|
存储 C语言
向函数传递字符串: C语言中的技术与实践
向函数传递字符串: C语言中的技术与实践
14 0
|
5天前
|
程序员 C语言
使用指针变量作为函数参数的C语言程序实例
使用指针变量作为函数参数的C语言程序实例
14 0
|
5天前
|
C语言
C语言函数嵌套与递归调用的深入解析
C语言函数嵌套与递归调用的深入解析
13 0
|
5天前
|
存储 C语言
C语言中向函数传递值和从函数返回值的技术解析
C语言中向函数传递值和从函数返回值的技术解析
15 0