random recording 随心记录
What seems to us as bitter trials are often blessings in disguise.
看起来对我们痛苦的试炼,常常是伪装起来的好运。
选择排序
内存工作原理
背景引入
假设你去看演出,需要将东西寄存。寄存处有一个柜子,柜子有很多抽屉。每个抽屉可放一样东西,你有两样东西要寄存,因此要了两个抽屉。你将两样东西存放在这里。现在你可以去看演出了!这大致就是计算机内存的工作原理。计算机就像是很多抽屉的集合体,每个抽屉都有地址。
fe0ffeeb是一个内存单元的地址,需要将数据存储到内存时,请求计算机提供存储空间,计算机会给一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表,但它们并非都适用于所有的情形。
数组和链表
假如要编写一个待办事件的应用程序,有4个待办事情,吃午饭,玩地滚球,喝茶,睡觉。
数组
数组是一串连续的内存地址。
用数组来管理待办事件,就需要申请一串连续的地址空间来存储,如果第四个事件的地址被占用,就需要重新申请其他连续地址空间,有点麻烦,也可以一开始就申请多余的空间,但这样会造成空间浪费,而且之后有更多的事情,还需要重新转移,这个情况可以考虑使用链表。
数组元素带编号,从下标索引0开始
需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素,即读取效率高,访问数组下标即可查询数据,即随机访问。
复杂度
链表
链表中的元素可存储在内存的任何地方,链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
使用链表来管理待办事件,就不需要考虑地址连续问题,可以动态地存储对象,分配内存。
链表查询效率低,每次访问元素,都需要从头开始,即顺序访问。但是删除,插入效率高
数组链表时间复杂度比较
选择排序实现
遍历列表,每次找出其中最大或最小元素,依次加入到新列表中。
# 找出列表最小值
def findSmall(arr):
value = arr[0] # 初始最小值
value_index = 0 # 索引
# 遍历
for i in range(1,len(arr)):
if arr[i] <= value:
value = arr[i]
value_index = i
return value_index
def selectSort(arr):
newArr = []
for i in range(len(arr)):
small = findSmall(arr)
newArr.append(arr.pop(small))
return newArr
print(selectSort([1,4,5,2,7,8])) # [1, 2, 4, 5, 7, 8]