C语言库函数qsort的使用详解

C语言库函数qsort的使用详解

什么是qsort函数?

qsort函数是C标准库中的一个排序函数,它可以对任意类型的数组进行排序。qsort函数需要5个参数,分别为待排序数组的首地址、元素的个数、元素大小、比较函数和可选的参数指针。

qsort函数使用步骤

第一步:编写比较函数

用于确定排序顺序的比较函数有两个参数,分别为需要比较的元素的指针。该函数需要返回一个整数值,用于指示比较结果:

  • 如果第一个元素应该出现在第二个元素之前,则返回一个负整数;
  • 如果第一个元素应该出现在第二个元素之后,则返回一个正整数;
  • 如果两个元素相等,则返回零。

该函数的定义方式如下:

int compare(const void *a, const void *b) {
    // 比较a和b指向的元素
}

第二步:调用qsort函数

调用qsort函数进行排序,qsort函数可以按照任何方式对元素进行排序。

qsort函数的原型如下:

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

参数说明:

  • void *base:需要排序的数组首地址。
  • size_t nmemb:元素个数。
  • size_t size:每个元素的大小。
  • int (*compar)(const void *, const void *):比较函数。

第三步:测试程序

实例程序:

#include <stdio.h>
#include <stdlib.h>

// 定义比较函数
int compare(const void *a, const void *b) {
    // 将a和b强制转换为整数类型的指针,并获取指针指向的值
    int x = *(int *)a;
    int y = *(int *)b;
    // 比较值的大小
    return x - y;
}

int main() {
    int arr[] = {54, 23, 87, 5, 41, 1, 98, 21};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 调用qsort函数进行排序
    qsort(arr, n, sizeof(int), compare);

    // 输出排序结果
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

输出结果:

1 5 21 23 41 54 87 98 

示例说明

示例一:字符串排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义比较函数
int compare(const void *a, const void *b) {
    // 将a和b强制转换为指向字符串的指针,并获取指针指向的值
    char *x = *(char **)a;
    char *y = *(char **)b;
    // 比较字符串大小,使用strcmp函数
    return strcmp(x, y);
}

int main() {
    char *str_arr[] = {"hello", "world", "apple", "banana", "orange", "pear"};
    int n = sizeof(str_arr) / sizeof(str_arr[0]);

    // 调用qsort函数进行排序
    qsort(str_arr, n, sizeof(char *), compare);

    // 输出排序结果
    for (int i = 0; i < n; i++) {
        printf("%s ", str_arr[i]);
    }

    return 0;
}

输出结果:

apple banana hello orange pear world 

示例二:结构体排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[20];
    int age;
} Person;

// 定义比较函数
int compare(const void *a, const void *b) {
    // 将a和b强制转换为指向Person结构体的指针,并获取指针指向的结构体
    Person *p1 = (Person *)a;
    Person *p2 = (Person *)b;
    // 比较年龄大小
    return p1->age - p2->age;
}

int main() {
    Person person_arr[] = {{"Tom", 20}, {"Jerry", 19}, {"Mary", 21}, {"Lisa", 18}};
    int n = sizeof(person_arr) / sizeof(person_arr[0]);

    // 调用qsort函数进行排序
    qsort(person_arr, n, sizeof(Person), compare);

    // 输出排序结果
    for (int i = 0; i < n; i++) {
        printf("%s %d\n", person_arr[i].name, person_arr[i].age);
    }

    return 0;
}

输出结果:

Lisa 18
Jerry 19
Tom 20
Mary 21

以上就是关于C语言库函数qsort的使用详解,包括比较函数的定义方法和调用qsort函数进行排序的步骤,并提供了字符串排序和结构体排序的示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言库函数qsort的使用详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言 基本语法示例讲解

    这里为大家讲解一下“C语言 基本语法示例讲解”的攻略。 1. 基本语法 1.1 变量声明 在C语言中,首先需要声明变量名及其类型。如: int a, b, c; float f; double d; 上述代码中,声明了整型变量a、b、c,单精度浮点型变量f和双精度浮点型变量d。 1.2 变量赋值 在声明变量后可以进行其它操作,如赋值。如: a = 10; b…

    C 2023年5月23日
    00
  • C语言 递归实现排雷游戏

    C语言 递归实现排雷游戏 介绍 排雷游戏是一款非常经典的休闲小游戏,本文将详细介绍如何使用C语言递归实现排雷游戏。 实现原理 排雷游戏的核心就是根据玩家翻开格子的情况,计算周围雷的数量并显示在格子上。 对于每一个格子,我们需要进行以下操作: 如果该格子是雷,则直接显示在格子上 如果该格子不是雷,则计算周围雷的数量n,如果n为0,则继续递归翻开周围的格子直到不…

    C 2023年5月23日
    00
  • C++11/14 线程调用类对象和线程传参的方法

    C++11/14 引入了 std::thread 类和一些线程库支持,可以方便地支持在 C++11/14 中创建线程。当需要在线程内调用类的对象或传递参数时,有几种方法可以实现。 调用类对象 使用成员函数 C++11/14 允许我们使用 lambda 表达式在一个新线程中调用一个类的某个成员函数。我们需要捕获类对象的引用,例如: class MyClass …

    C 2023年5月22日
    00
  • PostgreSQL 实现将多行合并转为列

    下面是详细讲解”PostgreSQL 实现将多行合并转为列”的完整攻略。 背景 假设当前有如下一张表格table1,其中id列为主键,col_name列为需要转为列的字段名称,col_value列为需要转为列字段对应的值。 id col_name col_value 1 name John 1 age 30 1 gender Male 2 name Emil…

    C 2023年5月22日
    00
  • 将List对象列表转换成JSON格式的类实现方法

    将List对象列表转换成JSON格式,一般使用JSON工具库实现,如Jackson和Gson。下面将分别介绍Jackson和Gson两个库的实现方法。 Jackson 步骤一:导入Jackson库 在pom.xml文件中添加以下依赖: <dependencies> <dependency> <groupId>com.fas…

    C 2023年5月23日
    00
  • c++对象内存布局示例详解

    首先,让我们来了解一下C++对象的内存布局。在实际编程中,我们经常会涉及到创建对象,并根据对象来进行操作。因此,了解对象在内存中所占的布局情况,对于有效地管理内存使用以及提高代码执行效率都很有帮助。 C++对象内存布局包括以下三个部分: 对象的数据成员 对象的虚函数表指针 (vptr) 对象的填充字节 数据成员是对象实际存储数据的部分,虚函数表指针用于处理虚…

    C 2023年5月22日
    00
  • Android蓝牙服务查找附近设备分析探索

    针对这个主题,我将为您提供一份完整的攻略。 Android蓝牙服务查找附近设备分析探索 1. 简介 蓝牙是一种近场无线通信技术,可以在手机、手表、耳机、电视和电脑等设备之间进行数据传输。Android蓝牙服务是Android系统提供的蓝牙应用程序编程接口(API),提供了一系列方法和工具,用于探索、连接和与其他蓝牙设备通信。在本文中,我们将介绍如何使用And…

    C 2023年5月23日
    00
  • Linux文件权限与目录管理详解

    Linux文件权限与目录管理详解 文件权限 在Linux中,文件有3种基本权限:读取、写入和执行。 权限符号 Linux文件权限使用符号来表示不同级别的权限,符号如下: 读取权限用“r”来表示 写入权限用“w”来表示 执行权限用“x”来表示 文件类型 在权限字符之前还有一个特殊的字符,表示文件类型,常见的类型有: 普通文件用“-”来表示 目录用“d”来表示 …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部