算法图解part2:选择排序
1.内存的工作原理
计算机可以理解为抽屉的集合体,每个抽屉都有地址。
内存工作主要就是 内存寻址、内存传输、存取时间和内存延迟。可参考经典的教材《计算机操作系统(第四版)》
当我们需要存放数据时,请求计算机提供存储空间,通过存储空间的地址进行数据的相关操作。
存储多项数据时有两种基本方式—— 数组和链表
2.数组和链表
数组
计算机分配出连续的存储空间为数组提供存储;数组可以通过元素的位置(即索引)来随机取数。而在插入或删除元素时,由于需要移动元素后面的位置,此时效率没有链表高。(有序数组一般先将插入的数到末尾,然后进行排序)
链表
链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。因此链表可以不用连续的内存空间,它的优势在于插入和删除元素方面。
链表补充:
从实现方式上看,文中提到的链表属于单链表,实际还有循环链表,双向链表。
- 单链表指的是链表中的元素的指向只能指向链表中的下一个元素或者为空,元素之间不能相互指向。也就是一种线性链表。
- 双向链表即是这样一个有序的结点序列,每个链表元素既有指向下一个元素的指针,又有指向前一个元素的指针,其中每个结点都有两种指针。
- 循环链表指的是在单向链表和双向链表的基础上,将两种链表的最后一个结点指向第一个结点从而实现循环。
常见数组和链表操作的运行时间
----- | 数组 | 链表 |
---|---|---|
读取 | O( 1 1 1) | O( n n n) |
插入 | O( n n n) | O( 1 1 1) |
删除 | O( n n n) | O( 1 1 1) |
3.选择排序(Python代码实现)
选择排序是一种灵巧的算法,但其速度不是很快,其运算时间为O( n ∗ n n*n n∗n),即O( n 2 n^2 n2)。
百度百科
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
将数组元素按从小到大的顺序排列:
①先编写一个用于找到数组中最小元素的函数
②再进行排序
Python代码如下:
//选择排序
def findsmall(arr): #找到数组中最小元素的函数
small = arr[0]
small_index = 0
for i in range(1,len(arr)): # i = 1~(len-1)
if arr[i] < small:
small = arr[i]
small_index = i
return small_index #返回最小值的索引值
def selectsort(arr): #排序算法
newArr = []
for i in range(len(arr)): #i = 0 ~ (len - 1)
small_index = findsmall(arr)
newArr.append(arr.pop(small_index)) #append()用于在列表末尾添加新的对象 pop()用于移除列表中的一个元素(输入索引,默认最后一个元素),并且返回该元素的值。
return newArr
arr_test = [1,9,2,7,5,6,8,3]
selectsort(arr_test)
运行结果:
[1, 2, 3, 5, 6, 7, 8, 9]
4.总结
- 计算机内存犹如一大堆抽屉。
- 需要存储多个元素时,可使用数组或链表。
- 数组的元素都在一起。
- 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。
- 数组的读取速度很快。
- 链表的插入和删除速度很快。
- 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。
5.参考资料
《算法图解》第二章
此部分学习算法内容已上传github:https://github.com/ShuaiWang-Code/Algorithm/tree/master/Chapter2