一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

c语言sort函数简单例子怎么写

时间:2026-09-09 12:50:50 编辑:袖梨 来源:一聚教程网

在前端开发内容学习中,c语言sort函数简单例子怎么写?看懂qsort参数和比较函数是常见主题。很多人在阅读时会遇到概念分散、步骤不清和注意点难以归纳的问题。本文按照基础概念、操作流程和关键细节,对相关内容进行整理。

很多人搜索c语言sort函数简单例子,实际想解决的是如何把排序代码快速写出来并看懂关键参数。下面先用整数数组演示完整写法,再说明比较函数和常见改法,方便直接套用。

qsort是不是C语言里的sort函数

C语言标准库里没有名为sort的函数,实际开发里常说的sort函数,多半指stdlib.h中的qsort。它是通用排序函数,可以给整数、字符数组、结构体数组做排序。

qsort本身不关心元素的具体类型,它只负责交换数据和控制排序过程。真正决定升序还是降序、按什么字段排序的,是你自己提供的比较函数。

先看一个最简单的整数排序例子

如果你只是想快速上手,先把整数数组按升序排出来最直接。这个例子包含头文件、比较函数、qsort调用和结果输出,适合先跑通再理解细节。

比较函数接收两个通用指针,需要先转回真实类型再比较。返回负数表示前者排在前面,返回正数表示后者排在前面,返回零表示两者相等。

  • 完整示例

    #include <stdio.h>
    #include <stdlib.h>
    
    int cmp_int_asc(const void *a, const void *b) {
        int x = *(const int *)a;
        int y = *(const int *)b;
        if (x < y) return -1;
        if (x > y) return 1;
        return 0;
    }
    
    int main(void) {
        int arr[] = {42, 7, 19, 3, 25, 10};
        int n = sizeof(arr) / sizeof(arr[0]);
    
        qsort(arr, n, sizeof(arr[0]), cmp_int_asc);
    
        for (int i = 0; i < n; i++) {
            printf("%d ", arr[i]);
        }
        printf("n");
        return 0;
    }
  • 编译命令:cc -std=c11 demo.c -o demo
  • 运行命令:./demo
  • 运行后输出结果:3 7 10 19 25 42
  • 如果你看到的是从小到大排列,说明比较函数和qsort参数都写对了。

qsort四个参数分别是什么意思

第一个参数是待排序数组的起始地址,通常直接写数组名。第二个参数是元素个数,第三个参数是每个元素占多少字节,一般写单个元素的大小最稳妥。

第四个参数是比较函数名,调用时不要在这里加括号。qsort每次比较两个元素时都会调用它,所以比较函数写对了,排序结果才会符合预期。

  • qsort(arr, n, sizeof(arr[0]), cmp_int_asc);
  • arr表示数组首地址。
  • n表示数组元素总数。
  • sizeof(arr[0])表示单个元素大小。
  • cmp_int_asc表示升序比较规则。

比较函数最容易写错的地方

很多初学者会直接用两个整数相减来判断大小,这种写法在数值较小时常能运行,但当整数范围较大时可能发生溢出。更稳妥的方式是分别判断小于、大于和等于三种情况。

另一个常见问题是指针转换写错。比较整数数组时要转成整数指针,比较结构体数组时要转成对应的结构体指针,类型一旦混用,结果就可能异常,严重时还会出现未定义行为。

  • 升序时,较小的元素应返回负数。
  • 降序时,把大小判断顺序反过来即可。
  • 比较函数参数类型固定是通用指针,进入函数后再转回真实类型。
  • 不要把元素个数和单个元素大小的位置写反。
  • 整数降序比较函数

    int cmp_int_desc(const void *a, const void *b) {
        int x = *(const int *)a;
        int y = *(const int *)b;
        if (x > y) return -1;
        if (x < y) return 1;
        return 0;
    }
  • 把qsort最后一个参数改成cmp_int_desc后,同一组数据会输出:42 25 19 10 7 3。

学会后怎样改成字符串或结构体排序

如果是字符串数组,比较函数里通常先把参数转成字符串指针的指针,再用字符串比较函数比较内容。因为数组元素本身是地址,所以这里比整数排序多一层转换。

如果是结构体数组,就先转成结构体指针,再取出要比较的字段。例如按分数、年龄或名称排序,通常只需要改比较函数,qsort调用本身并不用改动。下面先看一个最常见、最容易直接套用的字符串数组排序完整示例。

  • 字符串排序常配合strcmp使用。
  • 结构体排序时,先明确主排序字段。
  • 需要多条件排序时,可先比主字段,再比次字段。
  • 字符串数组升序排序完整示例

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int cmp_str_asc(const void *a, const void *b) {
        const char *s1 = *(const char * const *)a;
        const char *s2 = *(const char * const *)b;
        return strcmp(s1, s2);
    }
    
    int main(void) {
        const char *words[] = {"pear", "apple", "orange", "banana"};
        int n = sizeof(words) / sizeof(words[0]);
    
        qsort(words, n, sizeof(words[0]), cmp_str_asc);
    
        for (int i = 0; i < n; i++) {
            printf("%sn", words[i]);
        }
        return 0;
    }
  • 字符串示例输出:apple banana orange pear
  • 如果你想改成字符串降序,可以把比较函数返回值写成strcmp(s2, s1)
  • 结构体排序的写法和整数类似,只是把强制转换目标改成结构体指针,再比较具体字段。

先把整数数组这个简单例子跑通,再去改字符串和结构体版本会更容易。现在你既可以直接套用整数升序和降序模板,也可以把字符串示例改成自己的数据。只要记住qsort的四个参数和比较函数返回规则,C语言里的常见排序场景基本都能自己写出来。

热门栏目