前言:
今天是第二篇 学习两种数据结构 --- 数组、链表
在这之前你必须明白什么是大O表示法和对数 后面的算法也都会使用大O表示法
根据条件选择合适的排序 数组和链表各有优缺点 排序是一种重要的算法
数组是快速查找的基石 二分查找就是基于数组排序
链表修改速度快 如果有其他算法排理解起来会更容易
选择算法:
内存的工作原理:
- 就好比超市里的储物柜每一抽屉都才可以存东西而且对应条形码
- 每一个条形码就好比内存地址
- 计算机的内存就好像是很多抽屉的集合
- fe0ffeeb是一个内存单元的地址
需要储存多项数据时有两种基本方式 链表、数组 但他们并非都适用于所有情形
因此知道他们的差别很重要
数组和链表:
就好比你跟朋友去看电影,找到地方坐下后又来一位朋友,但原来坐的地方没位置了
你需要重新找一个可以容纳四个人的地方 所有人都会移到哪里去
如果又来一位就需要重新找地方
就好比内存空间 有一种做法是提前预留空间这种做法并不好
- 第一如果添加元素超出预留空间还是要重新分配内存
- 第二如果预留空间用不上 纯属浪费内存空间 你不用别人也用不了 再多的内存也架不住程序员的浪费
链表:
链表中的元素可用存放在内存的任何地方
每个元素都存储了下一元素的地址 从而使一些随机的内存串在一起
使用链表时 根本不需要移动元素 比如说6个人一起看电影 没有连座
这里用上网更合适 网吧打LOL 五连坐 对吧 如果没有五连坐 那我们只好分开来坐
因此只要有足够的内存空间就可以为链表分配内存
链表的每一个元素记录下一个元素地址 索引你在读取时必须读取到当前元素才能
获取下一个元素的地址
数组:
数组每个元素都有其地址
如图一个数组内有5个元素你只要知道其中一个就可以简单推算出其余数组的位置
数组是从0开始的 几乎所有的编程语言的整数都是从0开始的
- 元素的位置称为索引也叫下标
链表特点:
- 链表插入数据时不需要考虑位置关系只要有足够的空间就可以插入
- 链表的插入是随机的其元素没有顺序 所以插入元素时链表是更好的选择
- 删除元素链表也是更好的选择 因为只需修改一个元素指向的地址即可
数组特点:
- 数组的支持随机访问和顺序访问
- 读取效率非常高 数组是有序的
- 数组的就该就显得笨拙了 每次修改都要重新分配内存
- 插入数据时必须将后面的所有元素进行后移
O(n)代表遍历每一个元素一次
有了前面的知识你在选择排序时就能选择适当的储存方式就可以快速高效的排序
选择排序时一种灵巧的算法,其速度不是很快 快速排序是一种更快的排序算法
其运行时间为 O(n log n) 后面讲.....
小结:
- 极端及内存有了一大堆抽屉
- 需要存储多个元素时,可使用数组或链表
- 数组的元素都在一起
- 链表的元素是分开的,其中每个元素都储存在一个元素的地址
- 数组的读取速度很快
- 链表的插入和删除速度很快
- 在同一个数组中,所有元素的类型都必须相同(都为int,float等)
- 一般而言数组的使用较普遍
def FindSmallest(arr): smallest = arr[0] # 存储最小的值 smallest_index = 0 #存储最小元素的索引 for x in range(1, len(arr)): if arr[x] < smallest: smallest = arr[x] smallest_index = x return smallest_indexdef SelectionSort(arr): # 对数值进行排序 newarr = [] for x in range(len(arr)): smallest = FindSmallest(arr) # 找出数组中最小的元素 newarr.append(arr.pop(smallest)) # 将其加入到新的列表 return newarrprint(SelectionSort([3, 54, 7, 65, 12, 54, 5]))