简单选择排序和二元排序的Python实现

设有列表

n=10
nums=list(range(n))

简单选择排序

降序:第一步:n个数从左至右,索引从0开始至n-1,两两依次比较,记录最大索引,将大数和索引0数交换,如果大数就是索引0,则不交换;第二步从索引1开始比较…
升序:相反操作。

for i in range(n):
    maxindex=i   #假定最大值索引
    for j in range(maxindex+1,n):
        if nums[j]>nums[maxindex]:
            maxindex=j
    if maxindex !=i:
        nums[i],nums[maxindex]=nums[maxindex],nums[i]
print(nums)

二元排序

每一趟同时找出最大值和最小值。

for i in range(n//2):         #计数器,需要走的趟数为n//2
    maxindex=i
    minindex=-1-i
    minorigin=minindex+n   #转化为正索引,供下面进行比较使用
    for j in range(maxindex+1,n-i):  #i为右边有序区的个数
        if nums[j]>nums[maxindex]:
            maxindex=j
        if nums[-j-1]<nums[minindex]:
            minindex=-j-1
    else:
        minindex=minindex+n   #将最小值索引转化为正索引
    
    if maxindex !=i:
        nums[i],nums[maxindex]=nums[maxindex],nums[i]
        if minindex==i:     #假设当最小值索引为i,那么交换最大值的时候最小值索引会变动,由i变为最大值索引的位置上
            minindex=maxindex
    if minindex !=minorigin:    #索引都转化为正索引便于比较
        nums[minorigin],nums[minindex]=nums[minindex],nums[minorigin]

选择排序不能像冒泡法一样的在某一趟提前终止。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值