非递归实现
思路说明:
针对无序列表元素,每次选择待排序区域中最小的元素依次从最前面往后放,最后肯定是有序的。
设置第一个元素为最小值,遍历后续列表与设置的最小值比较,若小于最小值就将min_loc置于其位置,一轮就会找到一个最小值位置min_loc,放到第一个位置,第一轮结束。第二轮开始,从第二个位置开始重新进行循环。因为最后两个元素只需要比较一次,所以n个元素共循环比较n-1轮。
def SelectSort(ls):
for i in range(len(ls) - 1): # 每循环一次确定一个最小值
min_loc = i # 每次设置开始位置为最小值
for j in range(i + 1, len(ls)): # 遍历后续列表元素找最小值
if ls[j] < ls[min_loc]:
min_loc = j
if min_loc != i: # 最小值位置不是最初的位置时,进行交换
ls[i], ls[min_loc] = ls[min_loc], ls[i]
ls = [2, 1, 4, 6, 3, 5, 9, 7, 8]
SelectSort(ls)
print(ls)
排序过程如图所示:
递归实现
考虑每次循环完一轮就从下一个位置开始,从下一个位置进行递归,判断一下若当前开始循环位置不是最后一个位置就继续,否则结束递归。
def SelectSort(low, high, ls):
if low < high - 1: # 终止条件
min_loc = low
for i in range(low + 1, high): #遍历后续列表
if ls[i] < ls[min_loc]:
min_loc = i
if min_loc != low:
ls[low], ls[min_loc] = ls[min_loc], ls[low]
SelectSort(low + 1, high, ls) # 下一个位置进行递归
ls = [2, 1, 4, 6, 3, 5, 9, 7, 8]
SelectSort(0, len(ls), ls)
print(ls)
排序过程如图所示:每一趟确定一个位置的元素