服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言qsort()函数的使用方法详解

C语言qsort()函数的使用方法详解

2022-12-14 12:40ZDDWLIG C/C++

qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

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

1.参数含义

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

C语言qsort()函数的使用方法详解

 上图是qsort函数各个参数的含义,让我们一个个来看。

1.首元素地址base

我们要排序一组数据,首先我们需要找到这组数据在哪,因此我们直接将首元素的地址传给qsort函数来确定从哪开始排序。

2.元素个数num

我们知道了从哪开始,也要知道在哪结束才能确定一组需要排序的数据,但是我们不方便直接将结尾元素的地址传入函数,因此我们将需要排序的元素的个数传给qsort函数来确定一组数据。

3.元素大小size

我们知道qsort函数能排序任意数据类型的一组数据,因此我们用void*类型的指针来接收元素,但是我们知道void*类型的指针不能进行加减操作,也就无法移动,那么在函数内部我们究竟用什么类型的指针来操作变量呢?我们可以将void*类型的指针强制类型转换成char*类型的指针后来操作元素,因为char*类型的指针移动的单位字节长度是1个字节,我们只需要再知道我们需要操作的数据是几个字节就可以操作指针从一个元素移动到下一个元素,因此我们需要将元素大小传入qsort函数。

4.自定义比较函数compar

我们需要告诉qsort函数我们希望数据按照怎么的方式进行比较,比如对于几个字符串,我们可以比较字符串的大小(strcmp),也可以比较字符串的长度(strlen),因此我们要告诉qsort函数我们希望的比较方式,我们就需要传入一个比较函数compar就简写为cmp吧。

2.使用方式

1.头文件

C语言qsort()函数的使用方法详解

 要使用qsort函数我们首先需要引用一个头文件<stdlib,h>

?
1
#include <stdlib.h>

2.compar的实现

qsort函数给cmp函数规定了特定的参数。因此我们设计cmp函数时要严格遵守其参数设定。

?
1
int compar (const void* e1, const void* e2);

如果你要比较的数据是整形:

?
1
2
3
4
int cmp_int(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}

如果你要比较的数据是浮点型:

?
1
2
3
4
int cmp_float(const void* e1, const void* e2)
{
    return (int)(*(float*)e1 - *(float*)e2);
}

如果你要比较的是字符串的大小:

?
1
2
3
4
int cmp_str_len(const void* e1, const void* e2)
{
    return strlen((char*)e1)-strlen((char*)e2);
}

如果你要比较的是字符串的长度:

?
1
2
3
4
int cmp_str_len(const void* e1, const void* e2)
{
    return strlen((char*)e1)-strlen((char*)e2);
}

如果你要比较的数据是结构体变量:

?
1
2
3
4
int cmp_by_age(const void*e1, const void*e2)
{
    return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);
}

 需要注意的是:返回结果一定要确保是整形,如果不是一定要强制类型转换成整形!

3.整体代码

快速排序结构体变量示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdlib.h>
typedef struct stu
{
    //char name;
    int age;
    float weight;
    double hight;
}stu;
int cmp_by_age(const void*e1, const void*e2)
{
    return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);
}
int main()
{
    stu class1[3] = { {17,185.5,190.8}, {16,160.9,200.7}, {18,120.3,150.5} };
    int sz = sizeof(class1) / sizeof(class1[0]);
    int i;
    qsort(class1, sz,sizeof(class1[0]), cmp_by_age);
    for (i = 0; i < 3; i++)
    {
        printf("%.1f\n", class1[i].weight);
    }
    return 0;
}

总结

到此这篇关于C语言qsort()函数使用的文章就介绍到这了,更多相关C语言qsort()函数使用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/ZDDWLIG/article/details/120209948

延伸 · 阅读

精彩推荐
  • C/C++C++带头双向循环链表超详细解析

    C++带头双向循环链表超详细解析

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代...

    程序猿教你打篮球8242022-10-27
  • C/C++浅析C++中结构体的定义、初始化和引用

    浅析C++中结构体的定义、初始化和引用

    以下是对C++中结构体的定义、初始化和引用进行了详细的介绍,需要的朋友可以过来参考下...

    C++教程网6102020-12-24
  • C/C++利用C语言如何实现一些简单图形的打印

    利用C语言如何实现一些简单图形的打印

    这篇文章主要给大家介绍了关于利用C语言如何实现一些简单图形的打印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的...

    guguguhuha12462021-10-15
  • C/C++带你了解C语言的数据的存储

    带你了解C语言的数据的存储

    这篇文章主要为大家详细介绍了C语言的数据的存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助...

    sjp15111212021-12-16
  • C/C++OpenCV实现相机标定板

    OpenCV实现相机标定板

    这篇文章主要为大家详细介绍了OpenCV实现相机标定板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    房东丢的猫5302021-11-01
  • C/C++C++ random_shuffle()方法案例详解

    C++ random_shuffle()方法案例详解

    这篇文章主要介绍了C++ random_shuffle()方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    爱学习的蓝调5052021-12-21
  • C/C++C++实现MyString的示例代码

    C++实现MyString的示例代码

    本文主要介绍了C++实现MyString的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    悲伤土豆拌饭7612022-09-24
  • C/C++C++ OpenCV读写XML或YAML文件的方法详解

    C++ OpenCV读写XML或YAML文件的方法详解

    XML是一种元标记语言。所谓元标记,就是开发者可以根据自身需要定义自己的标记。YAML是一个可读性高,用来表达资料序列的格式。本文将通过C++和OpenC...

    求则得之,舍则失之11632022-11-25