最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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语言里的常见排序场景基本都能自己写出来。
相关文章
- c语音学生管理系统|核心功能怎么实现 09-09
- c语言编程怎么学 09-09
- tplink路由器关闭防火墙方法(tplink路由器如何关闭防火墙) 09-09
- c语言全套教程怎么学 09-09
- 卡拉彼丘手游安卓手机版首充选谁 卡拉彼丘手游安卓有哪些-常见内容和使用场景 09-09
- 城堡盟军最牛的5个阵容有哪些-常见内容和使用场景 09-09