• 选择排序


    选择排序

    标签(空格分隔): python-排序算法



    基本算法:一次确定一个最大值,或者最小值

    # 简单选择排序 降序排列
    lst = [1, 9, 2, 8, 7, 3, 6, 5, 4]
    length = len(lst)   # 计算长度
    
    for i in range(length): 
        maxindex = i    # 降序排列, 每次认为自己为最大值
    
        for j in range(i+1, length):  
            if lst[j] > lst[maxindex]:
                maxindex = j
    
        if i != maxindex:   # 当 i != maxindex 是, 再交换,可以减少几次交换
            lst[i], lst[maxindex] = lst[maxindex], lst[i]
            
    print("简单选择排序实现: {}".format(lst))
    
    

    二元选择排序

    • [x] 优化实现思路
      • 同时固定左边最大值, 和右边最小值(降序排列)
    • [x] 优点
      • 减少元素迭代的次数
    • [x] 时间复杂度为:
      • O(n*(n/2))

    算法优化: 一躺确定一个最大值,一个最小值

    # 二元选择排序算法 降序排列
    lst = [1, 9, 2, 8, 7, 3, 6, 5, 4]
    length = len(lst)
    
    for i in range(length//2): # 这里不是 length//2+1的原因是, 如果是奇数,极大值极小值交换就可以了,剩下的一定是中间值,或者,等于极大值或者极小值
        maxindex = i
        minindex = - i - 1
        minorigin = minindex
    
        for j in range(i+1, length-i):  # 计算极值
            if lst[j] > lst[maxindex]:
                maxindex = j
            if lst[-j-1] < lst[minindex]:
                minindex = -j-1
    
        # 实现交换
        if i != maxindex:
            lst[maxindex], lst[i] = lst[i], lst[maxindex]
    
            # 如果初始的极大值的位置是极小值, 则极大值交换后, 会影响极小值的位置
            if i == minindex or i == length + minindex:
                # i == length + minindex   考虑的是 minindex是负索引的情况
                minindex = maxindex
    
        if minorigin != minindex:
            lst[minorigin], lst[minindex] = lst[minindex], lst[minorigin]
    
    print("二元选择排序实现: {}".format(lst))
    

    算法改进: 如果再一轮中确认的最大值和最小值是同一个,则可以结束排序了

    • [x] 改进思路
      • 1、再二元选择排序中,如果在一轮比较中,极值相等,则可以可以确定排序已经完成,则可以提前跳出循环
      • 2、如果最小值和待交换的值相等,则可以不用交换
    • [x] 优点
      • 减少迭代元素次数
      • 减少元素交换次数
    # 二元选择排序算法 降序排列
    lst = [1, 9, 2, 8, 7, 3, 6, 5, 4]
    length = len(lst)
    
    for i in range(length//2): # 这里不是 length//2+1的原因是, 如果是奇数,极大值极小值交换就可以了,剩下的一定是中间值,或者,等于极大值或者极小值
        maxindex = i
        minindex = - i - 1
        minorigin = minindex
    
        for j in range(i+1, length-i):  # 计算极值
            if lst[j] > lst[maxindex]:
                maxindex = j
            if lst[-j-1] < lst[minindex]:
                minindex = -j-1
    
        # 优化点: 如果极大值和极小值相等,则排序已经完成
        if lst[minindex] == lst[maxindex]:
            break
    
        # 实现交换
        if i != maxindex:
            lst[maxindex], lst[i] = lst[i], lst[maxindex]
    
            # 如果初始的极大值的位置是极小值, 则极大值交换后, 会影响极小值的位置
            if i == minindex or i == length + minindex:
                # i == length + minindex   考虑的是 minindex是负索引的情况
                minindex = maxindex
    
        if minorigin != minindex and lst[minindex] != lst[minorigin]:
            # 优化点:lst[minindex] != lst[maxindex], 如果值已经相同则可以不用交换了
            lst[minorigin], lst[minindex] = lst[minindex], lst[minorigin]
    
    print("二元选择排序实现: {}".format(lst))
    

    简单选择排序总结

    • [x] 简单选择排序需要数据一轮一轮比较,并再每一轮中发现极值
    • [x] 没有办法知道当前轮是否已经达到排序要求,但是可以知道极值是否在目标索引位置上
    • [x] 遍历次数 1,... n-1 之和, n(n-1)/2
    • [x] 时间复杂度为: O(n*n)

    简单选择排序和冒泡法的比较

    • [x] 减少了交换次数,提高了效率,性能略高于冒泡法
  • 相关阅读:
    Python 3基础教程32-正则
    Python 3基础教程31-urllib模块
    Python 3基础教程30-sys模块
    Python 3基础教程29-os模块
    Python 3基础教程28-内置函数
    Python 3基础教程27-字典
    Python 3基础教程26-多行打印
    Python 3基础教程24-读取csv文件
    Python 3基础教程25-异常处理
    Python 3基础教程23-多维列表
  • 原文地址:https://www.cnblogs.com/jingru-QAQ/p/11405466.html
Copyright © 2020-2023  润新知