一.定义:
1.属于选择排序
2.两两比较大小,找出极值(极大值或极小值)被放在固定的位置,这个固定位置一般指的是某一端
3.结果分为升序和降序排列
4.降序:n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将大数和索引0数交换,如果大数就是索引0,不交换.第二轮,从索引1开始比较,找到最大值,将它和索引1位置交换,若它就在索引1位置则不交换.以此类推,每次左边都会固定下一个大数.
5.升序:和降序相反.
二.实现方法:
nums=[1,3,2,4,5,7,6]
length=len(nums)
for i in range(length):
maxindex=i
for j in range(i+1,length):
if nums[j]>nums[maxindex]:
maxindex=j
if i!=maxindex:
nums[i],nums[maxindex]=nums[maxindex],nums[i]
三.优化方法:二元选择排序
同时固定左边最大值和右边最小值,减少迭代元素的次数
1.length//2整除,通过几次运算就可以发现规律
2.由于使用了负索引,所以条件中要增加i==length + minindex
nums=[1,3,2,4,5,7,6]
length=len(nums)
for i in range(length//2): #利用负索引右置最小值
maxindex=i
minindex=-i-1
minorigin=minindex
for j in range(i+1,length-i):
if nums[maxindex]<nums[j]:
maxindex=j
if nums[minindex]>nums[-j-1]:
minindex=-j-1
if i!=maxindex:
nums[i],nums[maxindex]=nums[maxindex],nums[i]
if i == minindex or i==length + minindex: #若最小值被交换过,要更新索引
minindex = maxindex
if minorigin != minindex:
nums[minorigin],nums[minindex]=nums[minindex],nums[minorigin]
if minorigin != minindex and nums[minorigin] == nums[minindex]: #此处优化为排除元素值都相等的情况
nums[minorigin],nums[minindex]=nums[minindex],nums[minorigin]