C 语言 qsort()

17 Mar 2025 | 5 分钟阅读

qsort() 是 C 库中的一个预定义标准函数。我们可以使用此函数对数组进行升序或降序排序。它内部使用快速排序算法,因此得名 qsort。它可以对包括字符串和结构在内的任何数据类型的数组进行排序。它运行良好且易于实现。C++ 中有一个类似于 C 语言 qsort() 的 sort() 函数。在运行时间、安全性和灵活性等方面,sort() 都优于 qsort()。

本教程通过示例解释了 qsort() 函数。C 标准并未指定该函数的复杂度,但由于它内部遵循快速排序算法,因此其平均时间复杂度暂定为 O(n*logn)。该函数定义在 stdlib 头文件中,因此在使用前需要包含它。

函数语法

array:要排序的数组。

number:我们要排序的数组中的元素数量

size:数组中单个元素的大小

function:我们需要以指定格式编写的自定义比较函数

函数的指定格式

  • qsort() 会为数组中的每对元素调用 compare() 函数。
  • 参数 a 和 b 是两个 void 指针,指向要比较的两个元素。
  • 我们必须以如下方式编写 compare() 的主体:它应该返回
    1. 0,如果两个元素相等
    2. -1 或任何其他负整数,如果第一个元素小于第二个元素
    3. 1 或任何其他正数,如果第一个元素大于第二个元素。
  • 比较函数的名称可以是任何名称,但必须将其完全作为参数传递给 qsort() 函数。
  • const void* a 表示 a 是一个值固定的 void 指针。在使用之前,我们需要将 void 指针类型转换为某种数据类型。

现在,我们将探讨用于对不同数据类型数组进行排序的函数。

1. 对整数进行排序

输出

Enter the size of the array to be sorted: 5
Enter elements into the array: 98 34 89 0 2
The sorted array:
[0, 2, 34, 89, 98]

理解

在这两行

int a = *(int*) num1;

int b = *(int*) num2;

输入数组的类型为 <int>。因此,在执行任何内存分配操作之前,我们必须将 void 指针转换为整数指针。我们将两个指针指向的值存储在另外两个整数变量 a 和 b 中。然后,我们使用比较运算符比较这两个值。

我们可以使用一行代码代替使用两个额外的临时变量

  • 如果 a==b,则返回 0;如果 a > b,则返回一个正整数;如果 a < b,则返回一个负整数。

2. 对字符串进行排序

输出

Enter the size of the array to be sorted: 5
Enter elements into the array: hi hello how are you
The sorted array:
[are, hello, hi, how, you]

理解

  • 我们有一个字符串数组。整数数组和字符串数组的区别在于
    1. 整数数组是整数的集合
    2. 字符串数组是字符数组/字符指针的集合。
  • 因此,在 compare 函数中,我们需要将 void 指针转换为 (char**)a,而不是 (char*)a。
    [[字符串 1], [字符串 2]?]
    当我们使用 char* 时,它指向数组,然后,要指向数组中的字符串,我们需要一个双指针。
  • 我们在这里使用了 strcmp() 函数。该函数定义在 string.h 头文件中。我们首先需要包含它。
  • 该函数返回:
    1. 0,如果两个字符串相同
    2. 1,如果字符串中字符的 ASCII 值大于第二个字符串中相应字符的 ASCII 值
    3. -1,如果字符串中字符的 ASCII 值小于第二个字符串中相应字符的 ASCII 值。

3. 对结构体数组进行排序

输出

Original array:
[[1, 7], [4, 0], [9, 4], [8, 8], [2, 4]]
Sorted array:
[[1, 7], [2, 4], [4, 0], [8, 8], [9, 4]]

理解

我们声明了一个结构体类型的数组,这意味着数组中的每个元素都是结构体元素的数组。在上面的程序中,该结构体有两个整数元素。任务是根据第一个结构体元素对数组进行排序,如果任意两个第一个元素相等,我们则需要根据第二个元素对其进行排序。

示例

[[1, 2], [3, 4], [1, 4]]

排序后的数组:[[1, 2], [1, 4], [3, 4]]

我们使用了 rand() 函数为数组生成随机元素。在 compare() 函数中,我们需要将两个指针类型转换为结构体类型。

qsort() in C

使用 qsort() 的特殊之处在于我们可以按照自己的意愿设计自定义比较函数。我们还可以对数组中的一部分元素进行排序,而将其余元素保持不变。