思路
# 思路:每次选择出列表中的最大(小)值,然后将其从列表中移除,并将移除的值依次排列
基础版
@clocked
def select_sort(li):
li_len = len(li)
new_li = []
for i in range(li_len):
# 选出最小元素
min_val = min(li)
# 删除这个元素
li.remove(min_val)
# 将这个元素添加到一个新的列表中
new_li.append(min_val)
return new_li
优化
可以看到,上面的排序中,需要我们额外的申请一个数组,这样非常的消耗资源!比如一个1M的列表,经过排序后就会变成2M,如果是1G,经过排序后就会变成2G,所以是非常耗资源的,那么有没有可以优化的地方呢?
''' 答案是肯定的!就是原地排序。 原地排序,排序过程中,将列表分为两部分,左边设为有序区,右边设为无序区 每次选择无序区中的最小值和无序区中的第一个进行交换,交换完成之后,将其 合并到有序区,直到无序区只有一个元素,排序完成! '''
选择排序
@clocked
def select_sort2(li):
li_len = len(li)
for i in range(li_len - 1):
min_loc = i # 记录最小值的位置
for j in range(i + 1, li_len): # w无序区:[i,li_len-1]
# 找出最小值
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
测试
同步更新于个人博客系统:选择排序