在前端开发内容学习中,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第一个参数是待排序数组的起始地址,通常直接写数组名。第二个参数是元素个数,第三个参数是每个元素占多少字节,一般写单个元素的大小最稳妥。
第四个参数是比较函数名,调用时不要在这里加括号。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调用本身并不用改动。下面先看一个最常见、最容易直接套用的字符串数组排序完整示例。
字符串数组升序排序完整示例
#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
pearstrcmp(s2, s1)。先把整数数组这个简单例子跑通,再去改字符串和结构体版本会更容易。现在你既可以直接套用整数升序和降序模板,也可以把字符串示例改成自己的数据。只要记住qsort的四个参数和比较函数返回规则,C语言里的常见排序场景基本都能自己写出来。