最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
c语言sort函数_用法和示例详解
时间:2026-09-08 14:04:50 编辑:袖梨 来源:一聚教程网
在前端开发内容学习中,c语言 sort函数_用法和示例详解是常见主题。很多人在阅读时会遇到概念分散、步骤不清和注意点难以归纳的问题。本文按照基础概念、操作流程和关键细节,对相关内容进行整理。

很多人搜索c语言 sort函数,实际想解决的是C语言里怎样完成数组排序、该用什么函数、比较函数怎么写,以及常见报错该如何避免。本文用清晰示例把这些关键点一次讲明白。
C语言里有没有直接叫sort的标准函数
标准C语言库里并没有名为sort的通用排序函数,实际开发中通常使用stdlib.h提供的qsort。很多资料口中的“C语言 sort函数”,本质上说的就是这个标准库排序接口。
如果你在C++里见过sort,那是algorithm中的模板函数,写法和C语言不同。只要是纯C代码,就应优先理解qsort的参数含义、比较函数规则,以及它适合处理哪些数据。
先看结论
- C语言标准库没有通用的
sort函数,纯C代码通常应使用qsort。 - 如果你看到的是sort或std::sort,多半是C++里的algorithm头文件用法,不是标准C写法。
- 如果你的项目是纯C,请继续看qsort的参数和示例;如果你的项目是C++,应改查std::sort的用法。
- 搜索词纠偏时可直接记住:C语言查qsort,C++查std::sort。
qsort函数的基本写法和参数含义
qsort的核心思路很直接:把待排序数组的首地址、元素个数、单个元素大小,以及比较函数一起传进去,库函数就会按比较结果完成排序。
最容易出错的地方不是调用本身,而是比较函数。比较函数接收两个void指针,需要先转换成正确类型,再返回负数、零或正数,分别表示前者小于、等于或大于后者。
函数原型
qsort原型
#include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
参数说明
base表示数组起始地址nmemb表示数组中的元素数量size表示每个元素占用的字节数,常写为sizeof(arr[0])compar表示比较函数,决定升序还是降序以及比较规则
整数数组排序示例
学习qsort最合适的入口就是整数数组,因为类型转换最清楚,也最容易看出比较函数的返回逻辑。下面这段代码可以直接完成升序排序,适合先跑通流程再迁移到结构体或字符串场景。
写整数比较函数时,不建议简单返回a-b。原因是当数值范围较大时,理论上可能出现溢出。更稳妥的写法是用条件表达式分别返回1、0、-1。
整数数组升序完整示例
#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, 7}; 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
字符串和结构体排序怎么写
当排序对象不是整数,而是字符串或结构体数组时,思路仍然一样,变化只在比较函数。字符串通常用strcmp比较,结构体则根据某个字段决定顺序,比如成绩、年龄、价格或时间。
如果要给结构体排序,先明确排序依据,再在比较函数里取出两个结构体对象对应字段进行比较。规则一旦写清楚,qsort就能复用到大多数业务数据处理场景。
字符串数组排序示例
字符串数组排序
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmp_str_asc(const void *a, const void *b) { const char * const *s1 = (const char * const *)a; const char * const *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; }
结构体排序完整示例
按成绩升序排序结构体数组
#include <stdio.h> #include <stdlib.h> typedef struct { char name[20]; int score; } Student; int cmp_student_score_asc(const void *a, const void *b) { const Student *s1 = (const Student *)a; const Student *s2 = (const Student *)b; if (s1->score > s2->score) return 1; if (s1->score < s2->score) return -1; return 0; } int main(void) { Student students[] = { {"Tom", 82}, {"Lucy", 95}, {"Jack", 76}, {"Lily", 82} }; int n = sizeof(students) / sizeof(students[0]); qsort(students, n, sizeof(students[0]), cmp_student_score_asc); for (int i = 0; i < n; i++) { printf("%s %dn", students[i].name, students[i].score); } return 0; }- 先把void指针转换为对应结构体指针,再读取字段比较。
- 数字字段仍应避免直接相减,优先使用显式判断返回值。
- 如果想改成降序,只需对比较结果取反或交换大小判断。
使用qsort时常见问题和排查方法
不少人觉得qsort难用,不是因为接口复杂,而是因为几个细节容易忽略。只要把头文件、元素大小、指针转换和比较规则逐项核对,多数问题都能很快定位。
真正影响结果正确性的,往往是比较函数写错类型,或者把字符串数组、结构体数组当成普通整型数组处理。排查时先用最小示例验证,再替换成自己的业务数据,会更稳妥。
高频错误1:没有包含stdlib.h
错误写法
#include <stdio.h> int main(void) { int arr[] = {3, 1, 2}; qsort(arr, 3, sizeof(arr[0]), NULL); return 0; }- 报错现象:编译时可能出现qsort未声明、implicit declaration of function 'qsort'之类的提示。
- 原因:没有包含qsort所在的标准头文件
stdlib.h。 - 正确写法:补上
stdlib.h这个头文件,并传入有效比较函数。
高频错误2:字符串数组比较函数类型写错
错误写法
int cmp_bad(const void *a, const void *b) { const char *s1 = (const char *)a; const char *s2 = (const char *)b; return strcmp(s1, s2); }- 报错现象:能编译但排序结果混乱,严重时可能在运行时崩溃。
- 原因:当数组元素本身存放的是字符串地址时,qsort传入比较函数的是元素所在位置的地址,所以要先取出元素里保存的字符串地址,再交给strcmp比较。
- 正确写法:先按指向字符串指针的指针来转换参数,再取出两个字符串地址后调用strcmp。
高频错误3:size参数传错
错误写法
int arr[] = {9, 4, 7, 1}; qsort(arr, 4, sizeof(arr), cmp_int_asc);- 报错现象:通常不会直接报编译错,但排序结果异常,甚至可能发生越界访问。
- 原因:size参数要求的是单个元素大小,写成
sizeof(arr)后传入的是整个数组大小。 - 正确写法:把第三个参数写成
sizeof(arr[0])。
使用边界和注意事项
- 比较函数必须自洽:同一组数据反复比较时,返回规则要一致,否则结果不可预期。
- qsort不是稳定排序;如果两个元素比较结果相等,它们原本的先后顺序不一定保留。
- 字符串排序要区分数组形态:元素保存字符串地址的数组和二维字符数组,比较函数的取值方式不同,不能直接照搬。
- 整数、成绩、年龄这类数字比较不要直接写成return x - y,以免在极端值下溢出。
如果你搜索的是c语言 sort函数,最关键的结论就是:标准C里没有通用sort函数,实际应使用qsort;如果你看到sort,多半是C++里的std::sort。先从整数数组示例入手,确认比较函数写法无误,再扩展到字符串和结构体,同时注意常见报错和适用边界,排序相关问题基本都能解决。
相关文章
- 我的快餐店破解版无限金币无限钞票下载—免广告无限货币版最新 09-08
- tplink路由器ac900参数是多少(TPLink路由器AC900的主要参数有哪些) 09-08
- 第一个c语言程序_怎么编写并运行 09-08
- 蓝色星原旅谣如何肝 蓝色星原旅谣装备获取和强化 09-08
- C#三步实现方式Word转Excel并保留格式实用指南 09-08
- c语言学生成绩录入系统怎么设计 09-08