![秒懂算法:用常识解读数据结构与算法](https://wfqqreader-1252317822.image.myqcloud.com/cover/758/45372758/b_45372758.jpg)
1.6 插入
向数组中插入数据的效率取决于你想要插入的位置。
如果想在购物清单末尾加上"figs"
,那么只需要1步。
这是由于计算机的另一个特性:在将内存分配给数组时,计算机总是会记录数组的大小。
因为计算机知道数组的起始内存地址,所以计算数组最后一个元素的内存地址就很简单了:如果数组开始于内存地址1010,大小是5,那么它的最后一个内存地址就是1014。要在那之后再添加一个元素,只需放到下一个内存地址1015即可。
一旦计算机算出了存储新值的内存地址,它只需要1步就能完成插入。
下图展示了在数组末尾插入"figs"
的过程。
![](https://epubservercos.yuewen.com/BDEDD8/24438780101643106/epubprivate/OEBPS/Images/13.jpg?sign=1739274059-pfGpceCmbuHp0u2JnI9XkYUeOGUZ5m0h-0-44fbf4feb7c382a09cce52dbafe6066a)
不过还有一个问题。因为计算机本来在内存中给数组分配了5个格子,而现在我们又加了一个元素,所以就得再给数组多分配一个格子。在很多编程语言中,这是自动完成的。但每种编程语言的处理方式不同,这里就不详细介绍了。
以上就是在数组末尾插入元素的过程,但在数组开头或者中间插入新数据就是另一回事了。在这两种情况下,必须移动数据,来给要插入的数据腾出空间。这就需要额外步骤。
假设我们要在索引2处插入"figs"
。先来看下图。
![](https://epubservercos.yuewen.com/BDEDD8/24438780101643106/epubprivate/OEBPS/Images/14.jpg?sign=1739274059-j5aDqqAbz4Xz1WFnbgK9yldC90Z24Q92-0-ed8bd720d79c1284621720401b901d09)
为此,需要向右移动"cucumbers"
、"dates"
和"elderberries"
来给"figs"
腾出空间。这个过程需要多步,因为需要先把"elderberries"
向右移动一个格子,才能移动"dates"
。然后,再移动"dates"
来给"cucumbers"
让位。下面来详细看一下这个过程。
第1步:右移"elderberries"
,如下图所示。
![](https://epubservercos.yuewen.com/BDEDD8/24438780101643106/epubprivate/OEBPS/Images/15.jpg?sign=1739274059-LCsd020iMmqXQDgxCAeZBzIyew4NQe7u-0-46b463a5799411a4e7c897c418afe033)
第2步:右移"dates"
,如下图所示。
![](https://epubservercos.yuewen.com/BDEDD8/24438780101643106/epubprivate/OEBPS/Images/16.jpg?sign=1739274059-DjNHzxrpvh8VQK84d2ESQ6qXshnlIimt-0-b6fc83aac8becffc0825c84809f845ca)
第3步:右移"cucumbers"
,如下图所示。
![](https://epubservercos.yuewen.com/BDEDD8/24438780101643106/epubprivate/OEBPS/Images/17.jpg?sign=1739274059-d7Y3TBiKW6gKyt7r7OTR065G6l1Hfebp-0-2a42e3860b9ab75e67dacd6a0d35da12)
第4步:最后,在索引2处插入"figs"
,如下图所示。
![](https://epubservercos.yuewen.com/BDEDD8/24438780101643106/epubprivate/OEBPS/Images/18.jpg?sign=1739274059-bBn6OQXUWpR9f8ugDgofPHyPWiRhXwx0-0-fcd555c7fcd4eb48faf391735baae775)
注意,在这个例子中,插入需要4步,其中3步是数据右移,剩下1步是插入新值。
向数组开头插入元素需要步数最多,也就是所谓的最坏情况。这是因为要在数组开头插入元素,必须把其他所有值都右移一个格子。
对包含N个元素的数组来说,最坏的情况下需要N + 1步插入。这是因为需要移动N个元素,然后才能执行插入操作。
讲完插入,终于可以讲最后一个操作了,那就是删除。