news 2026/4/8 0:54:47

初识快速排序函数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/4/7 2:34:42

NCM格式解密实战:三步解锁网易云加密音乐

NCM格式解密实战&#xff1a;三步解锁网易云加密音乐 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲无法在其他播放器使用而困扰吗&#xff1f;今天我来教你一个超简单的NCM格式解密方法&#xff0c;只需…

作者头像 李华
网站建设 2026/4/6 16:01:26

何为黑客、骇客、白客与红客?四类角色的工作职责分别是什么?

黑客 起源 “黑客”一词是英文Hacker的音译。这个词早在莎士比亚时代就已存在了&#xff0c;但是人们第一次真正理解它时&#xff0c;却是在计算机问世之后。根据《牛津英语词典》解释&#xff0c;“hack”一词最早的意思是劈砍&#xff0c;而这个词意很容易使人联想到计算机遭…

作者头像 李华
网站建设 2026/4/5 17:09:27

Open-AutoGLM本地部署性能优化全攻略(内存占用降低80%的核心技巧)

第一章&#xff1a;Open-AutoGLM本地部署性能优化全攻略&#xff08;内存占用降低80%的核心技巧&#xff09; 在本地部署 Open-AutoGLM 时&#xff0c;高内存占用是常见瓶颈。通过模型量化、推理引擎优化与资源调度策略的协同调整&#xff0c;可实现内存占用下降超80%&#xff…

作者头像 李华
网站建设 2026/4/6 20:17:41

5分钟快速上手:六音音源修复版的终极使用指南

5分钟快速上手&#xff1a;六音音源修复版的终极使用指南 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 还在为洛雪音乐1.6.0版本后六音音源失效而烦恼吗&#xff1f;别担心&#xff0c;今天为大…

作者头像 李华
网站建设 2026/4/3 7:37:16

飞书文档批量导出实战指南:3步完成500+文件迁移的高效方案

飞书文档批量导出实战指南&#xff1a;3步完成500文件迁移的高效方案 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 当你面临办公平台切换或需要备份重要文档时&#xff0c;飞书文档的批量导出往往成为棘手难题。…

作者头像 李华