C语言中qsort函数的介绍与用法实例

C语言中qsort函数的介绍与用法实例

什么是qsort函数?

在C语言中,qsort函数是用于对数组进行排序的函数。它被定义在stdlib.h中,具有如下形式:

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

其中参数含义如下:

  • base: 待排序数组的指针,指向数组的首地址。
  • nmem: 数组元素的个数。
  • size: 数组元素的大小(字节数)。
  • compar: 用于比较数组元素大小的函数指针。

使用步骤

  1. 定义一个待排序的数组,确定元素个数和元素类型。
  2. 定义一个比较函数。
  3. 调用qsort()函数进行排序。

一个简单的示例

下面是一个简单的示例,其中我们使用qsort()函数对一个由字符串组成的数组进行排序,按字典序从小到大排序。

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

int compare(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b);
}

int main() {
    const int N = 5;
    const char *arr[N] = {"apple", "banana", "pear", "orange", "grape"};
    qsort(arr, N, sizeof(char *), compare);
    for (int i = 0; i < N; i++) {
        printf("%s ", arr[i]);
    }
    printf("\n");
    return 0;
}

输出结果为:

apple banana grape orange pear

另一个示例

下面是另一个示例,其中我们使用qsort()函数对一个由结构体组成的数组进行排序。

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

struct Student {
    char name[50];
    int age;
    float score;
};

int compare(const void *a, const void *b) {
    const struct Student *p = (const struct Student *)a;
    const struct Student *q = (const struct Student *)b;
    if (p->score != q->score) {
        return q->score - p->score;
    } else if (p->age != q->age) {
        return p->age - q->age;
    } else {
        return strcmp(p->name, q->name);
    }
}

int main() {
    const int N = 3;
    struct Student arr[N] = {
        {"Tom", 20, 80.5},
        {"Mary", 21, 89.0},
        {"John", 20, 80.5}
    };
    qsort(arr, N, sizeof(struct Student), compare);
    for (int i = 0; i < N; i++) {
        printf("%s %d %f\n", arr[i].name, arr[i].age, arr[i].score);
    }
    return 0;
}

输出结果为:

Mary 21 89.000000
John 20 80.500000
Tom 20 80.500000

在这个例子中,我们首先定义了一个名为Student的结构体,包含名称、年龄和分数三个成员。我们然后定义一个包含三个Student结构体的数组,并按分数从高到低、年龄从小到大、名称从小到大的顺序排列。我们可以使用qsort()函数将其实现,通过定义一个以两个结构体作为参数并返回整数的比较函数,来指定元素的顺序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中qsort函数的介绍与用法实例 - Python技术站

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

相关文章

  • js解析json读取List中的实体对象示例

    下面是“js解析json读取List中的实体对象示例”的完整攻略。 1. 什么是 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,常用于 Web 应用程序之间的数据传输。 JSON 数据是由键值对组成,键名必须是双引号包裹的字符串,键值可以是数字、字符串、布尔值、数组、对象等一些基本的数据类型。示例代码…

    C 2023年5月23日
    00
  • Java 异常详解

    Java异常详解 什么是异常 异常(Exception)是指程序在运行期间发生了意外或异常的事件。Java 中的异常是一种对象,它表示在执行过程中发生的错误,异常可以是 checked 或 unchecked。 Checked 异常需要在代码中显式地处理,否则会在编译期产生错误。 Unchecked 异常不需要在代码中显式地处理,编译器不会提示错误,程序在运…

    C 2023年5月23日
    00
  • C语言实现数学表达式运算

    C语言实现数学表达式运算 概述 C语言提供了一系列函数库,可以实现数学表达式的运算。本篇攻略将介绍如何使用C语言实现数学表达式的运算的方法。 函数库 在C语言中实现数学表达式计算,可以使用数学函数库<math.h>和字符串处理函数库<string.h>。 <math.h>函数库 该函数库中包括了常见的数学函数,例如四则运算…

    C 2023年5月22日
    00
  • 单链表的实现【02】:Student-Management-System

    一、问题引入 单链表的实现【01】:Student-Management-System 只体现了项目功能实现,未对代码部分做出说明。故新增随笔进行补充说明代码部分。 重构代码,迭代版本:Student Mangement System(Version 2.0) 二、解决过程 基于单链表实现就离不开链表的几个重要概念:头结点、首元结点、头指针 2-1 链表概念…

    C语言 2023年4月18日
    00
  • 使用eclipse搭建c/c++开发环境的详解步骤

    以下是使用Eclipse搭建C/C++开发环境的详解步骤: 1. 确认软件和环境 确保你已经安装了Eclipse和C/C++插件,以及C/C++编译器和调试器。其中常用的编译器有mingw和MSVC,调试器有GDB和LLDB等。 2. 创建C/C++项目 在Eclipse中创建一个C/C++项目。选择“File” -> “New” -> “C/C…

    C 2023年5月23日
    00
  • ajax实现动态下拉框示例

    讲解“ajax实现动态下拉框示例”的完整攻略如下: 一、什么是ajax Ajax 是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。它通过与服务器进行异步数据交互,无需重载整个页面就能够更新部分页面的数据。 二、ajax实现动态下拉框示例 1. 前端页面 首先,在HTML页面的<head>标签中引入jQuery库。然后,在HTML页面…

    C 2023年5月23日
    00
  • C++类的返回值是*this的成员函数问题

    C++类的成员函数,除了默认拥有一个指向调用该函数的类对象的指针this外,还可以返回一个指向该类对象的引用。而对于返回值为该类对象本身的情况,实际上返回的是指向该类对象的引用*this。 以下是具体的实现过程及示例说明: 1. 类的定义 首先,假设我们定义了一个名为MyClass的类,其中包含两个私有成员变量x和y。 class MyClass { pri…

    C 2023年5月22日
    00
  • C++设计模式之原型模式

    下面我将详细讲解 C++ 设计模式之原型模式的完整攻略。 什么是原型模式? 原型模式是一种创建者模式,它通过复制现有对象来创建新对象,而不是直接实例化新对象。它通过在运行时动态生成对象副本的方式来创建新对象,避免了创建新对象的成本,并提高了性能。 原型模式的优缺点 优点: 在运行时生成新对象,避免了创建新对象的成本。 代码复杂度低,易于实现。 可以实现对象动…

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