《算法图解》笔记
第二章、选择排序
一、数据和连表
内存的工作原理就像超市的储物柜,我想要存放东西时向计算机请求一个空间,计算机告诉我编号,也就是内存地址,我将数据存放进去。
当需要存储一系列的数据时,需要使用数组和链表来存储。
1、数组
数组中数据的内存地址都是连续的,这样非常方便查找,我只需要知道第一个数据的内存地址就能找到任意一个数据的内存地址,但是数组可能会出现一些问题,比如一个数组有三个数据,后面的内存地址被其他数据占据,当想给数组增加数据时就必须重新开辟一块内存空间,存储4个数据,如果又要添加则又要重新移动,效率很低。如果给数组预留空间,则可能会造成资源浪费,或者仍然不够用。
2、链表
链表中的数据都是随机存放的,不连续的,但是每个数据都会存储下一个数据的内存地址,这样一个链表就不用担心存满,只要内存够用就可以存储任意多的数据,但是链表的查询很困难,必须得从第一个数据一直找到所需要的数据,因为他的地址都在上一个地址那里。
3、链表数组
有一种方式可以综合链表和数组的优点,以英文名为例,一个数组有26个地址,分别指向一个链表,比如数组的第一个就指向的所有以a开头的名字的链表,这样查找和更新就非常方便。
二、选择排序
选择排序是每次找到序列中最大或最小的数放入一个新序列中,以此类推,时间复杂度是O(n*2)
选择排序是每次遍历无序区,找到无序区中的最小值,放到有序区的最后。

l = [3,7,1,4,2,5]
def choice_sort(li):
for i in range(len(li)):
min_index = i
for j in range(i, len(li)):
if li[j] < li[min_index]:
min_index = j
li[i], li[min_index] = li[min_index], li[i]
return li
print(choice_sort(l))
