首页/新闻资讯/正文详情

C语言算法实战:从数组去重到快速排序精解

发布时间:2026/11/3 12:01:57 来源:云帆数科 栏目:资讯中心
C语言算法实战:从数组去重到快速排序精解
1. C语言算法题精解从入门到实战我至今还记得大学时第一次接触C语言算法的场景——面对一堆看似简单的题目却无从下手。经过十多年的开发实践我整理了这套C语言算法解题方法论特别适合已经掌握基础语法但算法能力薄弱的学习者。这些题目覆盖了数组处理、指针操作、排序算法等核心知识点都是企业笔试和实际开发中的高频考点。2. 基础算法题型解析2.1 数组去重算法实现数组去重是面试中最常见的初级算法题看似简单却暗藏玄机。我们先看最基础的实现方案void removeDuplicates(int arr[], int *size) { if (*size 0) return; int newSize 1; for (int i 1; i *size; i) { int isDuplicate 0; for (int j 0; j newSize; j) { if (arr[i] arr[j]) { isDuplicate 1; break; } } if (!isDuplicate) { arr[newSize] arr[i]; } } *size newSize; }这个暴力解法时间复杂度为O(n²)适合小规模数据。实际开发中更推荐先排序后去重的方案时间复杂度可降至O(nlogn)int compare(const void *a, const void *b) { return (*(int*)a - *(int*)b); } void removeDuplicatesSorted(int arr[], int *size) { if (*size 0) return; qsort(arr, *size, sizeof(int), compare); int newSize 1; for (int i 1; i *size; i) { if (arr[i] ! arr[i-1]) { arr[newSize] arr[i]; } } *size newSize; }重要提示处理字符串去重时要注意\0结束符的位置否则可能导致缓冲区溢出2.2 矩阵转置算法剖析二维数组转置是理解内存布局的绝佳案例。以2行3列转置为3行2列为例void transpose(int src[2][3], int dst[3][2]) { for (int i 0; i 2; i) { for (int j 0; j 3; j) { dst[j][i] src[i][j]; } } }这个基础版本有几个优化点支持动态行列数原地转置方阵情况使用指针运算提升性能优化后的版本void transposeOptimized(int *matrix, int rows, int cols) { int size rows * cols - 1; int visited[size 1]; memset(visited, 0, sizeof(visited)); for (int start 1; start size; start) { if (visited[start]) continue; int current start; int temp matrix[current]; do { int next (current * rows) % size; int swap matrix[next]; matrix[next] temp; temp swap; visited[current] 1; current next; } while (current ! start); } }3. 排序算法深度实现3.1 快速排序的C语言实现快速排序是面试必考算法这个实现包含三数取中优化void swap(int *a, int *b) { int temp *a; *a *b; *b temp; } int medianOfThree(int arr[], int low, int high) { int mid low (high - low) / 2; if (arr[low] arr[mid]) swap(arr[low], arr[mid]); if (arr[low] arr[high]) swap(arr[low], arr[high]); if (arr[mid] arr[high]) swap(arr[mid], arr[high]); return mid; } int partition(int arr[], int low, int high) { int pivotIndex medianOfThree(arr, low, high); int pivotValue arr[pivotIndex]; swap(arr[pivotIndex], arr[high]); int i low; for (int j low; j high; j) { if (arr[j] pivotValue) { swap(arr[i], arr[j]); i; } } swap(arr[i], arr[high]); return i; } void quickSort(int arr[], int low, int high) { if (low high) { int pi partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi 1, high); } }3.2 排序算法性能对比算法类型时间复杂度(平均)空间复杂度稳定性适用场景冒泡排序O(n²)O(1)稳定小规模数据选择排序O(n²)O(1)不稳定交换成本高的场景插入排序O(n²)O(1)稳定基本有序数据快速排序O(nlogn)O(logn)不稳定通用场景归并排序O(nlogn)O(n)稳定链表排序/外部排序4. 实用算法技巧汇编4.1 浮点数相等判断的陷阱新手常犯的错误是用直接比较浮点数。正确做法#include math.h int isEqual(double a, double b) { return fabs(a - b) DBL_EPSILON; }更健壮的实现应考虑相对误差int isEqualRel(double a, double b) { double diff fabs(a - b); a fabs(a); b fabs(b); double largest (b a) ? b : a; return diff largest * DBL_EPSILON; }4.2 位操作实用技巧判断奇偶if (x 1) { // 奇数 } else { // 偶数 }交换两个数a ^ b; b ^ a; a ^ b;求绝对值int abs(int x) { int mask x (sizeof(int) * CHAR_BIT - 1); return (x mask) ^ mask; }5. 综合案例停车场管理系统核心算法这个课程设计项目涉及多个算法知识点#define MAX_SIZE 100 typedef struct { char plate[10]; time_t enterTime; } Vehicle; typedef struct { Vehicle data[MAX_SIZE]; int top; } Stack; typedef struct { Vehicle data[MAX_SIZE]; int front, rear; } Queue; // 栈操作 void push(Stack *s, Vehicle v) { if (s-top MAX_SIZE-1) { s-data[s-top] v; } } Vehicle pop(Stack *s) { if (s-top 0) { return s-data[s-top--]; } Vehicle empty {, 0}; return empty; } // 队列操作 void enqueue(Queue *q, Vehicle v) { if ((q-rear 1) % MAX_SIZE ! q-front) { q-data[q-rear] v; q-rear (q-rear 1) % MAX_SIZE; } } Vehicle dequeue(Queue *q) { if (q-front ! q-rear) { Vehicle v q-data[q-front]; q-front (q-front 1) % MAX_SIZE; return v; } Vehicle empty {, 0}; return empty; } // 计费算法 double calculateFee(time_t enter, time_t exit) { double hours difftime(exit, enter) / 3600.0; if (hours 0.5) return 0; // 30分钟内免费 if (hours 2) return 5; // 2小时内5元 return 5 ceil(hours - 2) * 2; // 之后每小时2元 }6. 算法调试与优化技巧6.1 内存错误排查使用gdb调试段错误(segmentation fault)的基本流程编译时添加-g选项gcc -g program.c -o program启动gdb调试gdb ./program常用命令run # 运行程序 backtrace # 查看调用栈 frame N # 切换到第N帧 print variable # 打印变量值 break filename:line # 设置断点 next # 单步执行6.2 性能优化策略空间换时间使用查找表替代实时计算// 预计算0-255的二进制1的个数 static const unsigned char bits_in_char[256] { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4, // ...剩余数据省略 }; int countBits(unsigned int n) { int count 0; unsigned char *p (unsigned char*)n; for (int i 0; i sizeof(n); i) { count bits_in_char[p[i]]; } return count; }循环展开优化// 优化前 for (int i 0; i 100; i) { sum array[i]; } // 优化后 for (int i 0; i 100; i 4) { sum array[i]; sum array[i1]; sum array[i2]; sum array[i3]; }数据局部性优化按行访问二维数组// 差的访问方式按列 for (int j 0; j cols; j) { for (int i 0; i rows; i) { sum matrix[i][j]; } } // 好的访问方式按行 for (int i 0; i rows; i) { for (int j 0; j cols; j) { sum matrix[i][j]; } }7. 进阶算法挑战7.1 DES加密算法实现DES算法虽然现在安全性不足但仍是理解分组加密的经典案例。核心结构typedef struct { uint32_t subkeys[16][48]; } DESContext; // 初始置换表 static const int IP[64] {58, 50, ...}; void desInit(DESContext *ctx, const uint8_t key[8]) { // 生成16轮子密钥 // ... } void desEncryptBlock(DESContext *ctx, const uint8_t input[8], uint8_t output[8]) { // 初始置换 // 16轮Feistel网络 // 最终置换 // ... }7.2 数据结构综合应用链表排序typedef struct Node { int data; struct Node *next; } Node; // 合并两个有序链表 Node* merge(Node *a, Node *b) { Node dummy; Node *tail dummy; dummy.next NULL; while (a b) { if (a-data b-data) { tail-next a; a a-next; } else { tail-next b; b b-next; } tail tail-next; } tail-next a ? a : b; return dummy.next; } // 归并排序主函数 Node* mergeSort(Node *head) { if (!head || !head-next) return head; // 快慢指针找中点 Node *slow head; Node *fast head-next; while (fast fast-next) { slow slow-next; fast fast-next-next; } Node *mid slow-next; slow-next NULL; return merge(mergeSort(head), mergeSort(mid)); }8. 算法学习路线建议基础阶段1-2个月掌握基本数据结构数组、链表、栈、队列理解时间/空间复杂度分析熟练实现基础排序算法提高阶段3-6个月学习树、图等高级数据结构掌握分治、贪心、动态规划等算法思想刷LeetCode简单/中等难度题目进阶阶段6个月研究高级图算法Dijkstra、A*等学习字符串匹配算法KMP、Boyer-Moore挑战系统设计问题个人经验建议每天保持2-3道算法题的练习量重点不是数量而是每道题都彻底理解。我习惯用笔记本记录每道题的多种解法和思路演变过程

相关推荐

MRP不是Excel算账:制造业时间-数量协同计划原理与落地避坑指南
MRP不是Excel算账:制造业时间-数量协同计划原理与落地避坑指南

简介:本资源是一份系统讲解物料需求计划(MRP)核心原理与实务应用的PPT课件,面向制造业生产计划员、供应链管理初学者及高校工业工程/物流管理专业学生,旨在帮助读者突破传统库存管理的盲目性困境,掌握基于主… · 2026/11/3 12:01:57

免登录文件分享工具文叔叔:链接提取码、临时存储与限期自毁
免登录文件分享工具文叔叔:链接提取码、临时存储与限期自毁

文件分享这件事,看着不起眼,但真到用的时候能急死人。微信发压缩包被拦、邮件附件卡在25MB、临时注册个网盘还得让对方也注册才能下——这些场景stack过的人都懂。我这次想聊的是一款叫文叔叔的文件分享工具,它属于“免登录、链接提取码、限期… · 2026/11/3 12:01:57

Qoder项目与讨论:重构人机协作的智能体范式
Qoder项目与讨论:重构人机协作的智能体范式

1. Qoder不是又一个AI代码插件,而是协作范式的迁移起点 最近在几个技术群和开发者论坛里,反复看到有人发截图:Qoder界面右上角多出了两个新按钮——“项目”和“讨论”。点进去不是弹窗,不是侧边栏,而是一个带状态管理… · 2026/11/3 12:01:56

从零开始AI工程:入门路径与核心技术栈全解析
从零开始AI工程:入门路径与核心技术栈全解析

ai-engineering-from-scratch,字面意思就是“从零开始搞AI工程”。作为一个在这个行业摸爬滚打了十几年的工程师,我每隔一两个月就会收到类似的问题:不懂AI、非科班出身、想转进这个领域,到底该怎么走?市面上课程一堆&… · 2026/11/3 13:26:16

十大经典排序算法原理与Python实现
十大经典排序算法原理与Python实现

1. 排序算法基础与核心概念 排序算法是计算机科学中最基础也是最重要的算法类别之一。作为数据处理的核心操作,排序直接影响着数据库查询、搜索引擎结果、数据分析等众多应用的性能表现。在实际开发中,我们经常需要对数据进行排序处理,比如电… · 2026/11/3 13:26:16

FAST-LIO源码精读:流形状态、ikd-Tree与工程避坑
FAST-LIO源码精读:流形状态、ikd-Tree与工程避坑

简介:围绕FAST-LIO论文与源码整理的个人理解文档,面向已具备ROS、C与SLAM基础、希望吃透LiDAR-IMU紧耦合框架的读者,可用于梳理算法脉络、对照代码理解实现细节。压缩包仅含1个docx,体积约5.09MB,内容按基础准备、FAST… · 2026/11/3 13:26:16

2024年TensorFlow生产实践:安装、部署与PyTorch选型指南
2024年TensorFlow生产实践:安装、部署与PyTorch选型指南

你要是现在打开技术讨论区,大概率会看到一种论调:TensorFlow 已经凉了,学它不如学 PyTorch。我在 2024 年还选择把 TensorFlow 写进生产环境,不是因为我守旧,而是因为我把模型从开发环境推到线上那条路走了太多次&… · 2026/11/3 13:26:16

RS-485电动窗帘中控协议解析:帧结构、CRC校验与联调实现
RS-485电动窗帘中控协议解析:帧结构、CRC校验与联调实现

简介:杜亚管状电机开合帘485协议文档面向智能家居集成商、电动窗帘控制开发者和中控调试人员,聚焦管状电机与外部设备之间的RS-485通讯规则与数据格式。内容围绕波特率9600bps、8位数据位、1位停止位、无校验等参数展开,说明以0x55为起始码的… · 2026/11/3 13:26:16

PyCharm 2025.3.3安装指南与性能优化技巧
PyCharm 2025.3.3安装指南与性能优化技巧

1. PyCharm 2025.3.3 安装前的准备工作 作为一名使用PyCharm多年的开发者,我深知一个顺畅的安装过程对编程新手的重要性。PyCharm作为Python开发领域的顶级IDE,其2025.3.3版本带来了诸多性能优化和新功能,但在安装前仍需要做好充分准备。 1… · 2026/11/3 13:25:14

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码