数组
看清 O(1) 访问的本质,掌握插入删除的真实代价
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
数组
看清 O(1) 访问的本质,掌握插入删除的真实代价
一维数组的定义及引用
上一节我们认识了数组是「同类型数据的集合」。这一节聚焦最基础的形态——一维数组:它怎么定义、下标从几开始、内存里长什么样、以及如何读写某个元素。
柜子紧挨排列并编号,要取某件按编号直接定位;数组下标就是这编号(只是从 0 起算)
一维数组应用--冒泡排序
前页我们已经能用下标访问一维数组。现在把[5,2,4,1]排成升序:让较大的数一次次越过相邻的小数,最终移动到末端,这就是冒泡排序。
每轮从左向右比较,较大数像气泡一样,经相邻交换逐步移到尚未排好的末端。
选择法排序
冒泡排序靠相邻元素反复互换,交换次数动辄几十次。换个思路:每趟只在未排序区里挑出最小值,只换一次——这就是选择法排序。
从队伍里扫一遍找出最矮的,拎到已排好队形的末尾;反复此动作直到所有人就位
一维数组的典型应用--查找
上一页我们把数组排好序了,本页就用排好的数组讲查找。手机通讯录找'张三',两种思路:直接从头翻,或者先翻到'Z'开头。这两种思路,对应数组里最经典的两种查找方法。
顺序=一本本翻;二分=字典先按首字母缩范围,再二分定位
矩阵
前几页我们把数据排成一排就够了——成绩单、温度记录。但只要问题里同时出现两个维度,比如「第几行第几列」「第几周第几节课」,一根线就装不下。该请出矩阵了。
行号对应第一维下标,列号对应第二维下标,每个单元格就是一个元素
二维数组的应用
上一页我们看了矩阵的概念——矩阵在程序里怎么存、怎么操作?这就轮到二维数组出场了。
几排几座对应 arr[i][j],行号=排、列号=座
字符数组与字符串
前页我们用二维数组处理了矩阵数据。如果只存一行字符——比如一个人的名字——一维数组就够了;但要存一个「可识别长度」的文本,C 语言会把它定义为特殊的字符数组,这就是字符串。
字符依次坐进椅子排队,最后那张空椅就是「队伍到此为止」的标记
二级C考点解析之数组的定
前几页我们已经用一维数组做冒泡排序、用二维数组处理矩阵。但考试最爱考的,往往不是怎么用,而是定义和引用的几条硬规则——这页我们把这些规矩一次性说透。
楼名=数组名(地址常量);房号1~n对应下标0~n-1;楼只有n层就没有n+1号房
字符串与字符数组
前面我们认识了字符数组——它就是装字符的容器。但 C 里说「字符串」时,有一条隐形约定必须先讲清楚:末尾那个看不见的 '\0'。今天就拆开这条暗线。
每颗珠子是一个字符,末尾那颗挂坠就是'\0'——没有它就找不到项链的终点
本节要点
- ✓数组名是首地址常量,不能被赋值(sizeof/& 除外)
- ✓下标从 0 起,遍历边界常见错在 < n 与 <= n-1
- ✓冒泡与选择同为 O(n²),差别在交换频率与稳定性
- ✓二维数组按行优先连续存储,可映射为一维
- ✓字符串以 '\0' 结尾,所有处理函数都依赖此约定
课后思考
先合上书想清楚再翻答案——三个问题分别对应回顾、应用、迁移三个层次。
参考答案数组名是首元素地址。a[i] = *(a+i) 意味着下标就是偏移量,a+0 自然等于 a 本身。这也解释了 a 与 &a 数值相同、类型不同——一个指向元素,一个指向整个数组。
参考答案比较次数:冒泡 O(n²) 最坏 / O(n) 最好(加标志位后);选择始终 O(n²)。交换次数:选择恒为 O(n),冒泡最坏 O(n²)。基本有序时改进版冒泡更优。
参考答案s 是 char*(指向首元素),&s 是 char(*)[10](指向整个数组)。数值相同(都指向首字节),但 +1 的偏移量由指针类型决定——这是数组与指针关系最经典的边界题。