#交换排序 简单版本
# nums = [1,9,7,4,5,7,21,6,8,655,4]
# length = len(nums)
# count_swap = 0
# count_iter = 0
# for i in range(length):
# maxindex = i
# for j in range(i+1, length):
# count_iter += 1
# if nums[maxindex] < nums[j]:
# maxindex = j
# if i != maxindex:
# nums[maxindex], nums[i] = nums[i],nums[maxindex]
# count_swap += 1
# print(nums,count_iter,count_swap)
# 交换排序二 二元优化版本
nums = [1,9,7,4,5,7,21,6,8,655,4]
count_swap = 0
count_iter = 0
length = len(nums) #计算nums长度
for i in range(length//2): #让比较次数减少
maxindex = i #假设一个最大值索引
minindex = -i -1 #假设一个最小值索引
minorigin = minindex #把最小的索引给minorigin
for j in range(i+1, length - i): #循环遍历 从I +1开始 到 长度减i 每次循环都会固定两个值 减少遍历次数
count_iter += 1
if nums[maxindex] < nums[j]: #让假设的最大值索引跟后面的所有数作比较
maxindex = j #如果有比它大的就重新赋值最大索引
if nums[minindex] > nums[-j -1]: #让假设的最小索引值跟后面的做比较 如果大于就表示后面还要更小的索引值
minindex = - j -1 #重新赋值最小索引
if nums[maxindex] == nums[minindex]: #判断最大索引是否跟最小索引的值相同 如果相同就break 表示已经摆好顺序不用比较了
break
if i != maxindex: #判断i 等不等于最大索引值 不等于进入
nums[i],nums[maxindex] = nums[maxindex],nums[i] #将他们索引对应的值交换
count_swap += 1
if i == minindex or i == length + minindex: #判断交换后对最小索引有没有影响 有的话就重新赋值最小索引
minindex = maxindex
if minorigin != minindex and nums[minorigin] != nums[minindex]: #判断最小索引等不等于最小索引 如果不等于进入 把他们的索引对应的值相互交换
minorigin,nums[minindex] = minorigin,nums[minindex] #交换索引对应的值
count_swap += 1
print(nums,count_iter,count_swap) #打印