news 2026/6/10 8:48:56

初识快速排序函数qsort()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初识快速排序函数qsort()

思路:题目说明用二分查找,每次查找向下取整,就清楚是跟二分查找有关了。但是需要注意题目其实并没有说输入的数组是有序的,所以在二分查找之前我们必须要先排序。考虑到时间复杂度的问题,这里我们选择用快速排序的方法。

转自豆包

qsort()是 C 标准库(<stdlib.h>)中的快速排序函数,用于对任意类型的数组进行排序,是 C 语言中常用的通用排序工具。

一、基本语法

c

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
  • 参数说明
    1. base:待排序数组的首地址(任意类型指针);
    2. nitems:数组的元素个数;
    3. size:数组中单个元素的字节大小(例如int类型填sizeof(int));
    4. compar比较函数指针,用于定义两个元素的比较规则。

二、比较函数的规则

比较函数的格式必须为:

c

int compar(const void *a, const void *b);
  • 函数逻辑:
    • 返回值< 0a应排在b之前;
    • 返回值= 0ab相等;
    • 返回值> 0a应排在b之后。

代码如下:

#include <stdio.h> #include <stdlib.h> // qsort的比较函数(升序) int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { int n, target; // 多组输入(EOF终止) while (scanf("%d", &n) != EOF) { int arr[n]; // 1. 输入无序数组 for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } // 2. 输入目标值 scanf("%d", &target); // 3. 对数组升序排序(关键:让二分查找可行) qsort(arr, n, sizeof(int), cmp); // 4. 二分查找(逻辑与之前一致) int left = 0, right = n - 1; int count = 0; int found = 0; while (left <= right) { count++; int mid = (left + right) / 2; if (arr[mid] == target) { found = 1; break; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } // 5. 输出结果 if (found) { printf("%d\n", count); } else { printf("NO.\n"); } } return 0; }

题2

思路:将非负数和负数分离,并记录原位置,分别按要求排序,把排好序的输入到原位置即可。

这里我们同样需要用到快速排序并对它有进一步的了解。

代码如下:

#include <stdio.h> #include <stdlib.h> // 非负数排序:升序(从小到大) int compare_non_neg(const void *a, const void *b) { return (*(int *)a - *(int *)b); } // 负数排序:降序(即绝对值从小到大,-1 > -2) int compare_neg(const void *a, const void *b) { return (*(int *)b - *(int *)a); } int main() { int n; // 输入序列长度 scanf("%d", &n); int arr[n], res[n]; int non_neg[n], neg[n]; // 存储非负数、负数 int idx_non_neg = 0, idx_neg = 0; // 非负数、负数数组的索引 int pos_non_neg[n], pos_neg[n]; // 存储非负数、负数在原数组中的位置 // 输入原序列,并分离非负数/负数,记录位置 for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); if (arr[i] >= 0) { non_neg[idx_non_neg] = arr[i]; pos_non_neg[idx_non_neg] = i; // 记录非负数的原位置 idx_non_neg++; } else { neg[idx_neg] = arr[i]; pos_neg[idx_neg] = i; // 记录负数的原位置 idx_neg++; } } // 对非负数、负数分别排序 qsort(non_neg, idx_non_neg, sizeof(int), compare_non_neg); qsort(neg, idx_neg, sizeof(int), compare_neg); // 初始化结果数组(可选,避免随机值) for (int i = 0; i < n; i++) { res[i] = 0; } // 回填非负数到原位置 for (int i = 0; i < idx_non_neg; i++) { res[pos_non_neg[i]] = non_neg[i]; } // 回填负数到原位置 for (int i = 0; i < idx_neg; i++) { res[pos_neg[i]] = neg[i]; } // 输出结果 for (int i = 0; i < n; i++) { printf("%d ", res[i]); } printf("\n"); return 0; }

转自豆包(简化了一下)

要理解这个比较函数里的指针用法,就要理解qsort对比较函数的要求:

qsort是 C 标准库的通用排序函数,能排序任意类型的数据(int、char、结构体等),所以它的比较函数参数被设计成const void *类型

  • const void *a/const void *b:表示 “指向任意类型数据的指针”,且指针指向的内容不可修改(const);

但我们要排序的是int类型数组,所以必须把void*转换成int*才能操作,这是指针转换的核心原因。

C 标准库qsort的排序顺序由 “比较函数” 控制

qsort是通用排序函数,它的排序顺序由比较函数的返回值决定:

  • 若希望升序:比较函数返回*(int*)a - *(int*)b
  • 若希望降序:比较函数返回*(int*)b - *(int*)a

有了这些基本知识的了解,就能用好快速排序了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:12:21

Zotero Citation插件完全指南:高效文献引用的终极解决方案

还在为学术写作中的文献引用效率低下而烦恼吗&#xff1f;Zotero Citation插件正是你需要的文献引用效率工具&#xff01;这款专为学术写作者设计的免费插件&#xff0c;完美连接Zotero文献管理软件与Microsoft Word&#xff0c;通过智能引用管理和自动化格式优化&#xff0c;彻…

作者头像 李华
网站建设 2026/6/10 10:13:32

AI Agent开发实战:从Prompt到多智能体协同的完整教程

文章详细介绍了AI Agent领域的四个热门职位及其要求&#xff0c;包括高薪的AI Agent专家/架构师、算法专家、Prompt工程师和开发工程师。这些职位要求掌握大模型应用、多智能体协同、Prompt工程等技术&#xff0c;需要具备深度学习框架使用、编程能力和数学基础。文章为想要进入…

作者头像 李华
网站建设 2026/6/10 10:04:06

2025 医疗 AI 必读综述:为什么说 LLM + 知识图谱是精准医疗的未来?

研究背景 本综述综合了大型语言模型&#xff08;LLMs&#xff09;与知识图谱&#xff08;KG&#xff09;的整合如何推动了医疗人工智能在方法、应用和评估领域的发展。LLM 在自然语言理解和上下文推理方面表现出色&#xff0c;而 KG 则提供结构化的事实知识&#xff0c;确保在医…

作者头像 李华
网站建设 2026/6/10 10:34:29

飞书文档批量导出神器:25分钟搞定700+文档的跨平台解决方案

还在为飞书文档迁移而烦恼吗&#xff1f;手动下载、格式错乱、目录丢失...这些困扰企业文档管理的问题&#xff0c;现在有了完美的解决方案。feishu-doc-export作为一款基于.NET Core开发的开源工具&#xff0c;让文档批量导出变得前所未有的简单高效。 【免费下载链接】feishu…

作者头像 李华
网站建设 2026/6/10 10:38:21

NCMconverter终极指南:5分钟掌握无损音频格式转换技巧

NCMconverter终极指南&#xff1a;5分钟掌握无损音频格式转换技巧 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否曾下载了NCM格式的音乐文件&#xff0c;却发现在常用播放…

作者头像 李华
网站建设 2026/6/10 10:42:25

还在公网调用大模型?教你本地部署Open-AutoGLM,数据安全+响应提速5倍

第一章&#xff1a;Open-AutoGLM本地部署的核心价值将 Open-AutoGLM 部署于本地环境&#xff0c;不仅保障了数据隐私与系统安全性&#xff0c;还赋予开发者对模型运行全过程的完全控制能力。在金融、医疗等对数据合规性要求严苛的领域&#xff0c;本地化部署成为不可或缺的技术…

作者头像 李华