随机访问
-
数组是一种线性数据结构,用连续的存储空间存储相同类型数据
-
线性表:数组、链表、队列、栈 非线性表:树 图
-
数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)
⚠️数组只在已知下标的情况下查找方便,时间复杂度为 O(1);即便是排好序的数组,你用二分查找,时间复杂度也是 O(logn);
插入
正常情况复杂度为O(n)
一个降低插入时间复杂度的方法
当不要求保持数组顺序时,可以直接将第 k 位的数据搬移到数组元素的最后,把新的元素直接放入第 k 个位置。
删除
最好情况时间复杂度为 O(1)(删除最后一个);
则最坏情况时间复杂度为 O(n)(如果删除开头的数据)
平均情况时间复杂度也为 O(n)。
已经降低删除时间复杂度的方法
我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。
数组越界
我们知道,在 C 语言中,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。根据我们前面讲的数组寻址公式,a[3]也会被定位到某块不属于数组的内存地址上,而这个地址正好是存储变量 i 的内存地址,那么 a[3]=0 就相当于 i=0,所以就会导致代码无限循环。
数组越界在 C 语言中是一种未决行为,并没有规定数组访问越界时编译器应该如何处理。因为,访问数组的本质就是访问一段连续内存,只要数组通过偏移计算得到的内存地址是可用的,那么程序就可能不会报任何错误。