本章内容
学习两种最基本的数据结构——数组和链表;
学习排序算法。
内存的工作原理
当计算机需要储存多项数据时,有两种基本方式——数组和链表。
链表
数组意味着所有项目的内存都是相连的。
链表中的元素可以储存在内存的任何地方。
链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串联在一起。
在链表中添加元素:只要将其放入内存,并将其地址存储到前一个元素中。
使用链表时,根本不需要移动元素,只要有足够的内存空间,就能为链表分配内存。
链表的优势在插入元素方面。
数组
数组与链表不同,使用数组可以知道每个元素的地址。而链表需要知道前一个元素的地址,才能知道下一个元素的地址。
在随机读取元素时,数组的效率很高,可以迅速找到数组的任何元素;而对于链表,需要先访问第一个元素才能获取第二个元素的地址。
元素的位置称为索引。
常见的数组和链表的运行时间:
数组 链表
读取 O(1) O(n)
插入 O(n) O(1)
其中,O(n)表示线性时间,O(1)表示常量时间。
中间插入:在使用链表时,插入元素很简单,只需要修改它前面的那个元素指向的地址即可;在使用数组时,必须将后面的元素都向后移。
在中间插入元素时,链表是更好的选择。
(中间)删除:链表在删除元素时,也是更好的选择,只需要修改前一个元素指向的地址即可;在使用数组时,删除元素后,必须将后面的元素都向前移。
删除元素总能成功,如果内存中没有足够的空间,插入操作可能失败,但在任何情况下都能将元素删除。
常见的数组和链表的运行时间:
数组 链表
读取 O(1) O(n)
插入 O(n) O(1)
删除 O(n) O(1)
仅当能够立即访问要删除的元素时,删除操作的运行时间才为O(1)。通常我们都记录了链表的第一个元素和最后一个元素,因此删除这些元素的运行时间为O(1)。
数组支持随机访问,而链表只能顺序访问。
选择排序
选择排序需要的总时间为O(n*n),即O(n2)。
选择排序Python3代码:
def findsmallest(arr): #定义一个寻找数组最小元素的函数
smallest = arr[0] #储存最小值
smallest_index = 0 #储存最小值的索引
for i in range(len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index #找出最小值的索引
def selectionsort(arr): #对数组进行从小到大的排序
newarr = [] #储存排序后数组
for i in range(len(arr)):
smallest = findsmallest(arr) #找到最小值的索引
newarr.append(arr.pop(smallest)) #加入到newarr中,并从原数组arr中删除
return newarr
print(selectionsort([3, 5, 1, 2])) #测试
小结
需要储存多个元素时,可以使用数组或链表;
数组的元素都在一起;
链表的元素是分开的,其中每个元素都储存了下一个元素的地址;
数组的读取速度很快;
链表的插入和删除速度很快;
在同一个数组中,所有的元素类型都必须相同。
欢迎大家多多批评指正
祝好
Violet HE
2019.2.27 20:36