选择排序法改进思路:
- 如果每轮只找最小值,效率较低,可以考虑每次同时寻找最小值和最大值;
- 并且在某一轮如果最小值与最大值相同,说明剩下的数字都相同,可以直接结束。
实现逻辑:
- 与选择排序不同的是,需要考虑到如果第i轮里,恰好第i个数就是最大值时
- 先交换minindex和i之后,最大值的下标变成了minindex
- 这时候应该交换minindex和n-i-1,而不是maxindex和n-i-1。
# -*- coding: utf-8 -*-
from swax_function import swax
def selection_sort2(x):
i = 0
'''
1、最小值更新的位置是:i
2、最大值更新的位置是:len(list)-1-i
3、整个list的索引的值最大是len(list)-1;因为索引从0开始
'''
while i <= len(x) // 2:
minindex = i
maxindex = i
j = i + 1
# 遍历后续位置,更新最大值和最小值的位置
while j < len(x)-i:
if x[minindex] > x[j]:
minindex = j
if x[maxindex] < x[j]:
maxindex = j
j+= 1
#如果最小值与最大值相同,说明剩下的数字都相同,可以直接结束
if x[minindex] == x[maxindex]:
return x
# 如果最小值的索引位置不是初始位置,则更新最小值到初始的位置
if minindex != i:
swax(x,i,minindex)
# 最大值和最小值的索引位置成对出现,
# 如果最大值的索引位置不是总的索引值减去最小值的索引,则更新最大值到对应的索引位置
if maxindex != len(x)-1-i :
# 如果初始索引的位置就是最大值时,先交换minindex和i之后,最大值的下标变成了minindex
if maxindex != i:
swax(x,len(x)-1-i,maxindex)
# 应该交换minindex和n-i-1,而不是maxindex和n-i-1
else:
swax(x,len(x)-1-i,minindex)
i+= 1
return x