• 查找和排序-4.选择排序


    用之前学过的Python自带方法排序

    def select_sort_simple(li):
    li_new = []
    for i in range(len(li)):
    min_val = min(li)
    li_new.append(min_val)
    li.remove(min_val)
    return li_new

    这个方法结果是没有问题的,但是不建议使用 :
      1.空间上使用两个列表 会多一倍内存消耗
      2.remove 会找到列表在删掉再往前补 所以时间复杂度是O(n*n)

    所以时间和空间复杂度来说都不是很好的实现方式


    选择排序
    def select_sort(li):
    for i in range(len(li)):
    min_loc = i
    for j in range(i+1,len(li)):
    if li[j] < li[min_loc] : #成立保证每一次交换的都是最小值
    min_loc = j #记录当前最小数值的索引
    print('min_loc',min_loc)
    li[i], li[min_loc] =li[min_loc],li[i] #min_loc = i 所以有交换但是数值没有变,所以不稳定
    print(li)

    li = [3,1,5,4,8]
    select_sort(li)

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,
    存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
    选择排序是不稳定的排序方法。

    时间复杂度

      杂度为 
    可以看出这个实现方法与冒泡排序很相似的,但是细看还是有区别的
      -冒泡排序每一次排序都是会交换 ,选择排序就只有冒泡的一半交换次数
      -冒泡排序是稳定的方法,选择排序不是稳定方法
     


  • 相关阅读:
    Best Time to Buy and Sell Stock
    Permutations II
    数组中最大和的子数组
    基于Socket.IO的Client封装
    Java中的ThreadLocal功能演示
    基于WebSocket的client封装
    Socket接口开发和测试实践
    自动化测试用例的原子性
    [CF1477C] Nezzar and Nice Beatmap
    [CF1477B] Nezzar and Binary String
  • 原文地址:https://www.cnblogs.com/sunny666/p/10761712.html
Copyright © 2020-2023  润新知