2.1内存的工作原理
fe0ffeeb是一个内存单元的地址。
需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。
2.2 数组和链表
有时候,需要在内存中存储一系列元素。假设你要编写一个管理待办事项的应用程序,为此需要将这些待办事项存储在内存中。
使用数组意味着所有待办事项在内存中都是相连的(紧靠在一起的)。再添加代办事项时,需要请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项都移到那里。
链表中的元素可存储在内存的任何地方。链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。在链表中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。
需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。在链表中,元素并非靠在一起的,你无法迅速计算出第五个元素的内存地址,而必须先访问第一个元素以获取第二个元素的地址,再访问第二个元素以获取第三个元素的地址,以此类推,直到访问第五个元素。
- 元素的位置称为索引。因此,不说“元素20的位置为1”,而说“元素20位于索引1处”
中间插入
需要在中间插入元素时,使用链表,插入元素很简单,只需修改它前面的那个元素指向的地址。
而使用数组时,则必须将后面的元素都向后移。如果没有足够的空间,可能还得将整个数组复制到其他地方!因此,当需要在中间插入元素时,链表是更好的选择。
删除
如果你要删除元素呢?链表也是更好的选择,因为只需修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。
运行时间
下面列出了常见的数组和链表操作的运行时间。
2.3 选择排序
将数组元素按从小到大的顺序排列。先编写一个用于找出数组中最小元素的函数。
def findSmallest(arr):
smallest = arr[0] #存储最小的值
smallest_index = 0 #存储最小元素的索引
for i in range(1,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)) #pop 移除列表中一个元素并返回该元素的值
return newArr
选择排序的时间为O(
n
2
n^2
n2)。第一次需要检查n个元素,但随后检查的元素数依次为
n
−
1
n - 1
n−1,
n
–
2
n – 2
n–2, …, 1。平均每次检查的元素数为1/2 ×
n
n
n,因此运行时间为O(
n
×
1
/
2
×
n
n × 1/2 × n
n×1/2×n)。但大O表示法省略诸如1/2这样的常数,因此简单地写作O(
n
×
n
n × n
n×n)或O(
n
2
n^2
n2)。