什么是选择排序?
假设一个无序的列表,每次用第一个数和其他数比较,比较出一个最小数,循环这个过程,这就是选择排序
我们用代码演示一下:
def selecct_sort_simple(li):
li_new = []
for i in range(len(li)):
min_val = min(li)
li_new.append(min_val)
li.remove(min_val)
return li_new
li = [3,1,4,2,6,8,7,9]
print(selecct_sort_simple(li))
上述代码中首先创建了一个新的列表,在循环中使用min函数判断出最小值,把min函数赋给一个变量,然后把这个变量添加到新的列表中,最后删除这个变量(节省空间),返回新的列表。
上述代码有两个比较明显的缺点:
- 第一,他需要开辟一个新的列表,这无疑会使空间复杂度大大增加。
- 第二,min函数和remove函数其实是非常消耗时间的,这同样会使时间复杂度也大大增加。
所以我们进行一些相应的优化
def select_sort(li):
for i in range(len(li)-1):
min_loc = i
for j in range(i+1,len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i],li[min_loc] = li[min_loc],li[i]
li = [3,1,4,2,6,8,7,9]
select_sort(li)
print(li)
- 第一层循环确定进行多少趟,因为还剩最后一个数时它肯定是最大的,所以是列表长度减1。
- 第二层循环里,定义一个变量,先假设第一个数是最小数,把这个数赋给变量,拿它和后面的数比较,如果后面的数比它小则交换位置, 最后把变量里的最小数放在列表最开始的位置。所以第二层循环的范围是趟数加1直到列表最后一个数。
上述优化解决了开辟新的列表导致的内存过大的问题,以及min函数和remove函数运行时间过长的问题,所以我们说这是一个比较好的优化。