第七周:数组运算
C语言学习笔记
本系列笔记是学习复盘慕课上浙江大学 翁恺老师《程序设计入门-C语言》课程的笔记和一些自己的总结。(文章的部分截图来自课程视频截图)
课程链接:https://www.icourse163.org/learn/ZJU-199001?tid=1206771253#/learn/content
7.1数组运算
7.1.1数组运算
数组在搜索中被广泛应用。而搜索又是现在非常重要的一个应用。
- 数组的集成初始化:
我们将得到数组的a[0]=2,其他的12个数字自动填零。
- 所以,如果我们想将一个数组全部初始化为0,我们其实可以不用循环去做到,直接
Cnt【number】={0};就会全部初始化为0了
- 集成初始化时的定位
EG2: Int a[10]={ [0]=2, [2]=3,6,};
是给a【0】赋值了2;给a【2】赋值了3;给a【3】赋值了6,其余的补充为0.
- 用n在初始化数据中给出定位
- 没有定位的数据接在前面的位置后面
- 其他位置的值补零
- 也可以不给出数组大小,让编译器算
- 特别适合初始化数据稀疏的数组
- 如何得到数组的大小?
Sizeof得到的数组占据多少个字节。
%lu 用来显示sizeof之后的结果
Sizeof(a)/sizeof(a[0])得到的是数组占据的元素
好处:一旦修改数组中初始的数据,不需要修改遍历的代码。
2. 数组的赋值
不可以 int b【】=a
数组变量本身不能被赋值;要把一个数组的所有元素交给另一个数组,必须采用遍历。
这是唯一可以把一个数组赋给另一个数组的方法,没有别的办法。
3.数组传入函数
- 数组作为函数的参数时,我们不能在【】中给出数组的大小,只能写a[];(如下面截图所示)
- 不能在函数内部利用sizeof来计算数组的元素个数
- 我们往往需要用另一个参数在主函数中计算好数组的大小,将它传入函数。(如下图中的length)
7.1.2数组例子:如何判断一个数是不是素数并且建立素数表?三种方式。
方法一:
方法二:只需要测试比x小的素数,它能不能整除;利用数组建立素数表
方法三:构造素数表
伪代码:
关于下标是否越界的两个小问题:
7.2搜索
7.2.1线性搜索
很重要!!!
基本方法:遍历(也就是叫线性搜索)
7.2.2搜索的例子
一种数据结构:散列表 hash table
构造两个数组,我们在第一个数组中用一个值10得到下标是2,再用这个下标去第二个数组中得到我们想要的结果也就是:dime
割裂的数组有什么问题?
这种程序的结构对于Cache 不友好。
我们希望把面额和名字放在一起。
7.2.3二分搜索
线性搜索最大的问题是它的效率问题。
二分搜索的前提:排好序
二分搜索最大的好处是:效率。 次数: log2N
1000个东西 log2(1000)=10
7.3排序初步
7.3.1选择排序
如果数据是无序的怎么办?
用选择排序的算法来对它进行排序。
第一步:找出最大
第二步:交换 swap a[maxid]和 a[len-1]
选择排序是用来将无序的数组变为有序的数组。