迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 语言中的排序函数

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将介绍几种在 C 语言中使用标准库排序函数的方法。


使用 qsort 函数对 C 语言中的整数数组进行排序

qsort 函数为不同的数据元素数组实现了某种通用的排序操作。也就是说,qsort 将函数指针作为第四个参数,传递给定元素数组的比较函数。在这种情况下,我们实现了 intCompare 函数来使用 qsort 比较整数组。注意,intCompare 应该具有 qsort 原型指定的类型 - int (*compar)(const void *, const void *)。因此,我们首先将 p1/p2 参数转换为 int 指针,然后再去引用它们来访问值本身。如果第一个参数小于另一个参数,比较函数的返回值必须是小于 0 的整数,如果前者大于后者,则返回大于 0 的整数,而相等则返回 0。

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

static int intCompare(const void *p1, const void *p2)
{
    int int_a = * ( (int*) p1 );
    int int_b = * ( (int*) p2 );

    if ( int_a == int_b ) return 0;
    else if ( int_a < int_b ) return -1;
    else return 1;
}

void printIntegers(int arr[], size_t size)
{
    for (size_t i = 0; i < size; i++)
        printf("%4d | ", arr[i]);
    printf("\n");
}

int main(int argc, char *argv[]) {
    int arr2[] = {53, 32, 12, 52, 87, 43, 93, 23};

    printIntegers(arr2, 8);
    qsort(arr2, 8, sizeof(int), intCompare);
    printIntegers(arr2, 8);

    exit(EXIT_SUCCESS);
}

输出:

53 |   32 |   12 |   52 |   87 |   43 |   93 |   23 |
12 |   23 |   32 |   43 |   52 |   53 |   87 |   93 |

使用 qsort 函数对 C 语言中的字符串数组进行排序

qsort 可以按升序对字符串数组进行排序,strcmp 作为比较函数。在这种情况下,我们声明并初始化了 char 指针数组,只要调用 qsort 函数,就可以对其元素进行排序。请注意,铸造和去引用是比较函数的必要部分,因为它将两个参数都作为 void 指针类型。

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

static int stringCompare(const void *p1, const void *p2)
{
    return strcmp(* (char * const *) p1, * (char * const *) p2);
}

void printStrings(char *arr[], size_t size)
{
    for (size_t i = 0; i < size; i++)
        printf("%10s | ", arr[i]);
    printf("\n");
}

int main(int argc, char *argv[]) {
    char *arr[] = {"jello",
                   "hello",
                   "mello",
                   "zello",
                   "aello"};

    printStrings(arr, 5);
    qsort(arr, 5, sizeof(char *), stringCompare);
    printStrings(arr, 5);

    exit(EXIT_SUCCESS);
}

输出:

jello |      hello |      mello |      zello |      aello |
aello |      hello |      jello |      mello |      zello |

或者,我们可以重新实现前面的示例代码,让用户提供带有程序参数的字符串数组,然后将排序后的数组打印出来作为输出。这一次,在继续调用 qsort 之前,必须检查是否有足够的参数传递给排序。注意,stringCompare 函数直接返回 strcmp 调用的值,因为后者与 qsort 的比较函数的返回值规格相同。

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

static int stringCompare(const void *p1, const void *p2)
{
    return strcmp(* (char * const *) p1, * (char * const *) p2);
}

void printStrings(char *arr[], size_t size)
{
    for (size_t i = 0; i < size; i++)
        printf("%10s | ", arr[i]);
    printf("\n");
}

int main(int argc, char *argv[]) {

    if (argc < 3) {
        printf("Usage: ./program string_0 string_1 string_2...\n");
        exit(EXIT_FAILURE);
    }

    printStrings(argv+1, argc-1);
    qsort(argv+1, argc-1, sizeof(char *), stringCompare);
    printStrings(argv+1, argc-1);

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

在 C 语言中使用位移操作

发布时间:2023/05/07 浏览次数:132 分类:C语言

本文演示了如何在 C 语言中使用位移操作。在 C 语言中使用 << 运算符将数字向左移位的方法

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便