C语言基础篇(7):数组进阶——排序、查找与字符数组
一、数组知识小结回顾在进入进阶内容之前先回顾数组的核心知识点1.1 为什么需要数组当需要处理大量同类型数据时如统计全班成绩逐个定义变量不现实数组提供了一种批量管理变量的方式。1.2 数组定义数据类型 数组名[数组长度]; int a[10]; // 定义了一个包含 10 个 int 型元素的数组1.3 数组的三大特点特点说明连续性数组元素在内存中占用一片连续的空间单一性数组中存放的是同一类型的数据有序性元素按下标顺序排列第一个后面就是第二个1.4 数组元素的引用通过下标访问数组中的具体元素a[0] 1; // 下标从 0 开始 a[1] 2;1.5 给值方式// 全部初始化 int a[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 部分初始化——前面的元素依次赋值后面默认为 0 int a[10] {1, 2, 3, 4, 5}; // 不初始化——数组中是随机值垃圾值 int a[10]; // 初始化成全 0 int a[10] {0}; int a[10] {}; // 初始化器默认给 0 // 初始化时省略长度由初始化值个数推算 int a[] {1, 2, 3, 4}; // 数组长度为 4注意数组不能整体赋值int a[10]; a {1, 2, 3, 4, 5}; // ❌ 错误必须逐个元素赋值 a[0] 2; // ✅ 正确二、排序算法2.1 选择排序核心思想给合适的位置选择合适的数。算法步骤外层循环控制位置内层循环从剩余元素中找到合适最小或最大的数放到当前位置。代码实现升序int i, j; for (i 0; i n - 1; i) // 外层控制位置 { for (j i 1; j n; j) // 内层从 i1 开始找数 { if (a[j] a[i]) // 如果找到更小的 { int t a[i]; // 交换 a[i] a[j]; a[j] t; } } }时间复杂度分析i 0 时内层循环 n-1 次 i 1 时内层循环 n-2 次 i 2 时内层循环 n-3 次 ... i n-2 时内层循环 1 次 总计1 2 3 ... (n-1) n(n-1)/2 n²/2 - n/2时间复杂度O(n²)用最高次项来反映增长趋势2.2 冒泡排序核心思想相邻两个元素两两比较小的往前放大的往后放像气泡一样浮到末尾。代码实现升序int i, j; for (i 1; i n; i) // 外层控制趟数 { for (j 0; j n - i; j) // 内层相邻比较 { if (a[j] a[j 1]) // 前面比后面大就交换 { int t a[j]; a[j] a[j 1]; a[j 1] t; } } }时间复杂度O(n²)2.3 插入排序核心思想将数据插入到已有的有序序列中通过和已排序的序列进行比较找到合适的位置插入。场景理解想象打扑克牌时每摸一张新牌就把它插入到手中已排好序的牌的正确位置。代码实现升序int i, j; for (i 1; i n; i) { int t a[i]; // 取出当前要插入的元素 j i; while (j 0 t a[j - 1]) // 在已排序序列中从后往前找位置 { a[j] a[j - 1]; // 比 t 大的元素往后挪 --j; } a[j] t; // 插入到正确位置 }时间复杂度分析i 1 时最多比较 1 次 i 2 时最多比较 2 次 i 3 时最多比较 3 次 ... i n-1 时最多比较 n-1 次时间复杂度O(n²)2.4 三种排序对比排序算法时间复杂度核心思想选择排序O(n²)给合适的位置选择合适的数冒泡排序O(n²)相邻元素两两比较大的往后冒泡插入排序O(n²)将元素插入到已排序序列的正确位置三、查找算法二分查找3.1 前提条件数据必须是有序的排好序的数组。3.2 核心思想每次找到中间位置将中间位置的值和要找的值比较中间值目标值 → 目标在左半部分中间值目标值 → 目标在右半部分中间值目标值 → 找到了3.3 过程图示以在有序数组中查找值1为例数组1 2 3 4 5 6 7 8 9 10 第 1 次中间值 55 1往左找 第 2 次中间值 22 1往左找 第 3 次中间值 11 1找到3.4 代码实现int begin 0, end n - 1, mid; int target; // 要查找的目标值 int found -1; // -1 表示未找到 while (begin end) { mid (begin end) / 2; // 中间位置 if (a[mid] target) { end mid - 1; // 目标在左半部分 } else if (a[mid] target) { begin mid 1; // 目标在右半部分 } else { found mid; // 找到了记录位置 break; } } if (begin end) { // 找到了 printf(找到了位置是 %d\n, found); } else { // 没找到 printf(没找到\n); }3.5 时间复杂度情况时间复杂度最好O(1)一次就找到最差O(logN)每次排除一半四、一维字符型数组与字符串4.1 字符数组的定义char s[10]; // 10 个 char 元素的数组大小 10 字节字符型数组和 int 型数组本质上没有太大区别主要是用来处理字符数据。4.2 字符串的存储方式C 语言中用双引号表示字符串常量hello字符串在内存中按字符数组方式存储char s[10] hello;下标0123456789值hello\0字符串结束标志\0。字符串的长度是\0前面有效字符的个数。4.3 字符数组的初始化// 用字符串常量初始化 char s[10] hello; // 用字符列表初始化部分初始化后面补 0 char s[10] {h, e, l, l, o}; // 等价于 h,e,l,l,o,\0,0,0,0,0 // 省略长度由初始化值推算自动包含 \0 char s[] hello; // 数组长度为 65个字符 1个\04.4 字符串与数组的关系字符数组是存放字符串的容器。处理字符串时更关心字符串什么时候结束\0而不是数组什么时候结束。因此数组长度显得不那么重要\0才是关键。4.5 获取字符串长度strlen#include string.h size_t strlen(const char *s);功能计算字符串长度\0前面有效字符的个数。注意strlen和sizeof不同——strlen不算\0sizeof算整个数组大小。char s[10] hello; strlen(s); // 返回 5h,e,l,l,o不算 \0 sizeof(s); // 返回 10整个数组的大小4.6 字符串复制strcpy#include string.h char *strcpy(char *dest, const char *src);功能将src中的字符串复制到dest中。参数src— 字符串源数组名或字符串常量。dest— 目标数组名或存放字符串的空间地址。返回值返回dest。char s1[10] hello; char s2[10] world; strcpy(s1, s2); // s1 变为 world4.7 字符串拼接strcat#include string.h char *strcat(char *dest, const char *src);功能将src中的字符串拼接到dest末尾。参数src— 字符串源数组名或字符串常量。dest— 目标数组名或存放字符串的空间地址。返回值返回dest。char s1[20] hello; char s2[10] world; strcat(s1, s2); // s1 变为 helloworld拼接思路1.定位到\0的位置。2.从\0位置开始依次复制src中的字符。3.最后补上\0。五、总结知识点核心要点选择排序给位置选数时间复杂度 O(n²)冒泡排序相邻两两比较大的往后冒时间复杂度 O(n²)插入排序将元素插入已排序序列的正确位置时间复杂度 O(n²)二分查找前提数据有序每次排除一半最好 O(1)最差 O(logN)字符数组用来存储字符串以\0作为结束标志strlen计算字符串长度不含\0strcpy字符串复制strcat字符串拼接

相关新闻

Unity移动端性能优化:深度解析Overdraw原理与实战解决方案

Unity移动端性能优化:深度解析Overdraw原理与实战解决方案

1. 项目概述:为什么Overdraw是移动端性能的“隐形杀手”?做Unity开发,尤其是面向移动平台,性能优化是个绕不开的坎。你可能会花大力气去优化脚本逻辑、减少Draw Call、压缩贴图,但游戏运行时帧率依然不稳,手…

2026/10/14 16:01:21 阅读更多 →
GitHub Actions 自动部署:从 push 到全国可达的完整流程

GitHub Actions 自动部署:从 push 到全国可达的完整流程

GitHub Actions 自动部署:从 push 到全国可达的完整流程工具地址:https://www.speedce.com 中文界面:https://speedce.com/?langzh-CN 联系:speedceadsgmail.com写在前面 Actions 部署成功后加一步 SpeedCE 验收。 本文是一份围绕…

2026/10/12 20:12:30 阅读更多 →
新手落地 AI 数字人避坑白皮书|区分云端共享账号、低价源码、本地买断,登登 AI 试用至采购全流程复盘

新手落地 AI 数字人避坑白皮书|区分云端共享账号、低价源码、本地买断,登登 AI 试用至采购全流程复盘

摘要大量零基础创业者在采购数字人系统时,容易踩三大陷阱:几百元 “永久云端账号”、无售后低价源码包、低价买断隐藏增值收费条款。本文从技术角度区分三类方案底层风险,结合登登 AI 完整试用、部署流程,给出一套可落地的采购验收…

2026/10/16 17:56:01 阅读更多 →

最新新闻

惯性导航解算算法实现:从IMU数据到ECEF位置的六步闭环

惯性导航解算算法实现:从IMU数据到ECEF位置的六步闭环

简介:本资源是一套完整的惯性导航解算算法实现工程,面向导航制导、智能无人系统、机器人定位等方向的本科生、研究生及嵌入式开发者,聚焦于INS核心姿态解算、加速度积分与卡尔曼滤波校正等关键环节,解决无GPS环境下自主定位与姿态…

2026/10/17 0:31:59 阅读更多 →
Kube-OVN 安装避坑指南:内核适配、网卡识别与版本兼容三重校验

Kube-OVN 安装避坑指南:内核适配、网卡识别与版本兼容三重校验

简介:本资源是一份面向Kubernetes运维工程师、云原生网络架构师及容器平台开发者的Kube-OVN深度技术文档,系统解析这一CNCF沙盒项目的网络设计哲学与工程实践。文档覆盖其三大核心优势:依托OVN/OVS实现的子网管理、VPC多租户、跨集群互联等丰…

2026/10/17 0:31:59 阅读更多 →
35岁后端转大模型:从零到求职的全路径实战规划

35岁后端转大模型:从零到求职的全路径实战规划

最近有个老同事约我吃饭,聊到一个特别现实的问题:35岁,传统后端开发干了十来年,薪资到顶,业务需求也在收缩,要不要all in大模型?他说自己把网上关于“35岁程序员转行大模型”的文章翻了个遍&…

2026/10/17 0:30:58 阅读更多 →
用户画像构建实战:从标签体系设计到计算存储的完整方案

用户画像构建实战:从标签体系设计到计算存储的完整方案

1. 用户画像构建的整体思路与方案选型用户画像这个词,这几年被提得很多,但真正落地做过的团队都知道,它不是一个“建张表、打几个标签”就完事的活儿。我前后参与过三个不同量级的画像项目,从早期几十万用户的小型推荐系统&#x…

2026/10/17 0:30:58 阅读更多 →
AI工具平权时代,真正拉开差距的是这四种稀缺能力

AI工具平权时代,真正拉开差距的是这四种稀缺能力

最近一段时间,我身边几乎所有人都在讨论AI工具。聊天群里天天有人分享新出的提示词,短视频上不断刷到"三分钟用AI做出爆款",公司内部更夸张,连搞行政的同事都在用AI写周报。一个很现实的问题摆在每个人面前:…

2026/10/17 0:30:58 阅读更多 →
2020春招后端与算法岗面试全攻略:线上笔试、手撕代码与项目深挖

2020春招后端与算法岗面试全攻略:线上笔试、手撕代码与项目深挖

2020年刚开年那阵子,身边准备春招的朋友普遍都有个感受:往年学长学姐留下的面经套路,突然就失效了。线下宣讲、现场笔试、群面大战这些经典环节被彻底重排,大部分流程都搬到了线上,一轮接一轮的视频面、电话面&#xf…

2026/10/17 0:30:58 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →