选择排序及其二元优化

选择排序

#交换排序  简单版本
# 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)

优化
优化2
优化3

# 交换排序二  二元优化版本

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)           #打印

总结

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值