上次我们学习了python算法中的二分查找,今天我们就来继续学习python中另一种常用的算法----选择排序
计算机存储数据的原理:
众所周知,我们内存的工作原理就像我们逛商场时的存物柜,每个柜子只能放进一个物品,你有两样物品要存,将物品存进(放进)柜子里后,你就可以去逛商场了!计算机就是多个柜子的集合,每个单独的柜子都有自己的地址
而当我们需要存多个数据的时候,我们有两种基本方式----数组和链表
数组:
我们还是拿我们的日常生活举个栗子,你和你的三个好朋友一起去看电影,你们坐在一起是不是就得先保证有四个连在一起的座位,然后你又来了一个好朋友,但是两边并没有空位了,我们就得再找到五个连在一起的座位,或者让旁边的陌生人向旁边挪一挪,这样就比较麻烦,我们也可以提前进行占座,我们先趁没人占上10个座位(虽然这样不道德,我们暂且不管),只要我们来的人不超过10个人,我们就可以直接做到这里,但是如果超过10个人,我们还得再重新找座位.
从上边的案例中,我们可以总结出数组的几个优缺点:
1.内存空间占用的少
2.因为我们的数据都是连着的,所以查找速度就四个字----芜湖!起飞~~
3.插入和删除的速度比较慢,当我们在中间插入新的数据的时候,新元素之后的数据都得向后移动,删除也是同理(只不过是向前移)
4.内存地址的利用率方面,不管你内存里还有多少空间,如果没办法一次性给出数组所需的要空间,那就会提示内存不足
5.若所留的空间占满了就无法再进行扩展
链表
链表中的元素可以存在任何的位置,链表中的每个元素都存储了下一个元素的地址,就像我们平时玩的解密游戏,第一个线索会提示下一个线索的位置,第二个会提示第三个的位置.
我们还是拿上面的栗子来说,链表相比于数组就像是我们在选座位的时候,我们分开来做,因此只要有足够的内存空间(座位),就能不断的为链表进行分配
数组与链表的优缺点:
数组:
优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
缺点:大小固定,不适合动态存储,不方便动态添加
链表:
优点:可动态添加删除 大小可变
缺点:只能通过顺次指针访问,查询效率低
选择排序:
基础知识了解了我们来正式的学习今天的重点,
还是来举个栗子:我们平时听的歌都会记录我们平时听的每首歌的次数,我们想将歌单里的歌按照听歌的次数由多到少进行排序
老规矩上才艺!!!
def kuaisubijiao(list):
num = list[0]
num_index = 0
for i in range(1, len(list)):
if num > list[i]: # 通过比较得到最小的数字的下标索引
num = list[i]
num_index = i
return num_index
def kuaisupaixu(list):
new_list = []
for i in range(1, len(list)):
num = kuaisubijiao(list)
new_list.append(list.pop(num))
return new_list
print(kuaisupaixu([5, 9, 25, 4, 1, 3, 8]))