2.1内存工作原理
假设你和你的朋友去看一场精彩的P站推荐电影,那么你就只是给工作人员说,我买两张票,然后根据票上的地址提示你们俩找到了座位去看精彩的电影。这就是计算机的工作原理,计算机就像一个很大的电影院,每个座位都有相应的地址。
2.2数组和链表
需要处理多个数据的时候,我们有两种基本的方式,数组和链表。
数组意味着所有元素都是邻居关系,物理空间紧密相连;
链表则意味着各元素之间通过地址相连接,物理空间并不连续。就像你在玩一个寻宝游戏,你到达第一处地方的时候,完成了第一个任务,接着你发现一个纸条,这个纸条告诉你下一个地方是什么,链表就是这么运行的,元素里存在一个地址告诉计算机下一个元素存储在哪里。
2.2.1链表
每一个概念的出现都是为了解决一个特定的问题,在学习之前,我们先考虑一个问题,不用链表行不行?
行,但是很麻烦。举个例子,你和一个朋友去看电影,你们自然而然地把座位选择在了一起,不一会儿,你又来了一个朋友,而你开始的两个座位旁边已经被其他人占用了,如果你们还是要坐在一起(对于数组来说,这是必须的),那你们只有再找一个地方,这个地方有连续的三个空位置,好了,假设位置找到了,悲催的事情发生了,你女朋友也要来看电影,于是,你又要死乞白赖地去找一个有连续四个空座位的地方,此刻,你心里紧张兮兮,可不要再来人了。
或者还有另外的一种解决方案,你直接事先买了十张电影票,座位都是连续的,这种方法十分土豪,对于内存来说,如果你最后只来了两个人,那么其余的八个内存空间就被浪费了,如果最后来了十一个人,那么内存位置又要重新申请,怎么解决呢?链表。
链表不怕人多,还是回到刚刚的电影院案例,你们几个想要坐在一起其实就是为了感知对方的存在,那这样,现在每个人手上都有一条红线,这条线可以连接你和你的朋友,让你感知到你朋友的心跳,只要你们都左手拿着连接给别人的线,右手拿着别人传递给你的线,那么你们的感情就依然亲密,这时候来了一个人,没事,让她随便坐,然后给她一条红线,让别人接过这条红线就可以了,你们还是一个整体。
由此可知,链表实现插入操作很丝滑、流畅。
2.2.2数组
既然链表这么好,可以随便插入,那么都用链表不就可以了吗?为什么还要用数组呢,这个问题问得非常好。
链表插入很快,但是!!!找人很难,回到上面的例子,上面来了个女孩子,被别人用红线牵着,现在她男朋友过来电影院要把她领走,带她去优衣库试衣服。怎么找呢?在链表中只能这样找:顺着第一个人的红线一直找过去,就像一个铁链子一样,你不知道你女朋友在哪一环,所以只能挨个找。这就像一个网页给你推荐了十大P站经典电影排行榜,首先的页面是第十个,然后你只能一直按“next"十下才能找到第一的那个经典文艺电影?气不气?实际上,不是开玩笑,这样的网页结构确实是用链表结构来实现的。
回到我们的问题,用链表虽然插入快(找到一个空闲的座位容易)但是读取难(被男朋友找到比较困难)
数组刚好是反过来的,数组读取很简单,每个元素都有一个编号,找人的时候我只需要找到对应的编号就可以了。(不过问题在于,你需要知道你女朋友座位的编号,如果不知道编号,领的可能是你女朋友的男同学,对于这样的一个问题,后面还有更好的解决方式,就是字典,也叫散列表,对于散列表来说,你只需要知道你的女朋友叫牛翠花就行了,然后到电影院大喊一声:“牛翠花何在?速与我去优衣库试衣服”,然后牛翠花就从座位中出来了,你根本不需要知道你女朋友坐在哪里,何况每次座位都不同,记着编号总没有记着名字容易)
2.3选择排序
现在我们有一个豆瓣根据我们的喜好推荐的电影列表,我们要对他们进行一个从高到低的排行。怎么做呢?
电影名称 | 播放次数 |
---|---|
满城尽带黄金甲 | 125 |
头文字D | 146 |
东风破 | 5555 |
大理寺日志 | 123456789 |
美丽人生 | 563 |
1、首先在这一列中找到最大的,放到一个新列表中,并把这个元素从老的列表中移除
电影名称 | 播放次数 |
---|---|
大理寺日志 | 123456789 |
2、重复上一步骤,找到移除后列表中最大的,添加到新列表的第二项
电影名称 | 播放次数 |
---|---|
大理寺日志 | 123456789 |
东风破 | 5555 |
在编程中实现其实就是两个步骤,首先要写一个寻求最小值的函数,其次是一个添加到新列表中的函数。代码如下:
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 selcetionSort(arr):
newer=[]
for i in range(len(arr)):
smallest =findSmallest(arr)
newer.append(arr.pop(smallest))
return newer
print(selcetionSort[5,3,6,8,12,65,9])