python 选择排序

# 选择排序:选择极大或极小值,跟第一个进行交换
lst = [1, 3, 9, 8, 5, 2, 7, 4, 6]
length = len(lst)
for i in range(length):
maxValueIndex = i # 先假定第一个为最大值
for j in range(i+1, length): # 从第二个开始跟第一个比较
if lst[j] > lst[maxValueIndex]:
maxValueIndex = j;

if i != maxValueIndex: # 找到最大值的index后,进行交换
tmp = lst[i]
lst[i] = lst[maxValueIndex]
lst[maxValueIndex] = tmp

print(lst)

print('-------------------------------------')
# 选择排序:优化 - 每趟分别找到最大值和最小值
lst = [1, 3, 9, 8, 5, 2, 7, 4, 6]
length = len(lst)
for i in range(length // 2): # 循环少一半
maxValueIndex = i # 先假定第一个为最大值
minValueIndex = -i-1 # 假定最后一个为最小值
minOrigin = minValueIndex # 记录最小值的原始index
for j in range(i+1, length-i): # 从第二个开始跟第一个比较
if lst[j] > lst[maxValueIndex]:
maxValueIndex = j
if lst[- j - 1] < lst[minValueIndex]:
minValueIndex = - j - 1

if i != maxValueIndex: # 找到最大值的index后,进行交换
tmp = lst[i]
lst[i] = lst[maxValueIndex]
lst[maxValueIndex] = tmp
# 如果最小值被交换过,更新索引
if i == minValueIndex or i == length + minValueIndex:
minValueIndex = maxValueIndex

# 最小值索引不同,但值相同,不用交换了
if minOrigin != minValueIndex and lst[minOrigin] != lst[minValueIndex]:
tmp = lst[minOrigin]
lst[minOrigin] = lst[minValueIndex]
lst[minValueIndex] = tmp

print(lst)

print('-------------------------------------')
# 选择排序:优化 - 最大值最小值相等,跳出循环
lst = [1, 3, 9, 1, 1, 1, 1, 1, 1]
length = len(lst)
for i in range(length // 2): # 循环少一半
maxValueIndex = i # 先假定第一个为最大值
minValueIndex = -i-1 # 假定最后一个为最小值
minOrigin = minValueIndex # 记录最小值的原始index
for j in range(i+1, length-i): # 从第二个开始跟第一个比较
if lst[j] > lst[maxValueIndex]:
maxValueIndex = j
if lst[- j - 1] < lst[minValueIndex]:
minValueIndex = - j - 1

# 如果元素相同,结束循环
if lst[maxValueIndex] == lst[minValueIndex]:
break

if i != maxValueIndex: # 找到最大值的index后,进行交换
tmp = lst[i]
lst[i] = lst[maxValueIndex]
lst[maxValueIndex] = tmp
# 如果最小值被交换过,更新索引
if i == minValueIndex or i == length + minValueIndex:
minValueIndex = maxValueIndex

# 最小值索引不同,但值相同,不用交换了
if minOrigin != minValueIndex and lst[minOrigin] != lst[minValueIndex]:
tmp = lst[minOrigin]
lst[minOrigin] = lst[minValueIndex]
lst[minValueIndex] = tmp

print(lst)
原文地址:https://www.cnblogs.com/lizitest/p/9553652.html