• python3实现数据结构与算法30天-排序-选择排序(5)


    算法思路:
    每次选出最小的,放入第一个位置,
    再一趟排序记录列表无序区最小的数,放第二个位置

    算法关键点:有序区和无序区,无序区最小的数
    时间复杂度:O(n^2)

    1.简单版-代码:

    import
    
    def select_sort_simple(lst):
        """create new list, callback min & remove"""
        lst_new = []
        for i in range(len(lst)):
            min_loc = min(lst)
            lst_new.append(min_loc)
            lst.remove(min_loc)
            print(lst_new)
        return lst_new
    
    
    lst = [random.randint(0, 100) for x in range(10)]
    print(lst)
    print(select_sort_simple(lst))
    

    结果:

    [33, 67, 92, 15, 39, 23, 10, 53, 95, 25]
    [10]
    [10, 15]
    [10, 15, 23]
    [10, 15, 23, 25]
    [10, 15, 23, 25, 33]
    [10, 15, 23, 25, 33, 39]
    [10, 15, 23, 25, 33, 39, 53]
    [10, 15, 23, 25, 33, 39, 53, 67]
    [10, 15, 23, 25, 33, 39, 53, 67, 92]
    [10, 15, 23, 25, 33, 39, 53, 67, 92, 95]
    [10, 15, 23, 25, 33, 39, 53, 67, 92, 95]
    

    上面方法可以说是选择排序的简单实现,但存在几个问题,min(),remove()其实也是O(n)级别,而且开辟新的列表,消耗内存,如果序列很大,内存资源消耗大,不建议用。
    下面的相当于升级版,改善之处在于,不用开辟新的序列,另外做到能抠则抠,尽量减少不必要的循环,选择排序推荐使用。

    2.升级版-代码:

    import random
    
    def select_srot(lst):
        for i in range(len(lst)-1): # i是第几趟
            min_loc = i
            for j in range(i+1, len(lst)): # j是无序区, 从i+1开始
                if lst[min_loc] > lst[j]:
                    min_loc = j
            lst[i], lst[min_loc] = lst[min_loc], lst[i]
            print(lst)
    
    lst = [random.randint(0, 100) for x in range(10)]
    print(lst)
    print(select_srot(lst))
    

    结果:

    [3, 22, 92, 84, 97, 52, 27, 39, 1, 63]
    [1, 22, 92, 84, 97, 52, 27, 39, 3, 63]
    [1, 3, 92, 84, 97, 52, 27, 39, 22, 63]
    [1, 3, 22, 84, 97, 52, 27, 39, 92, 63]
    [1, 3, 22, 27, 97, 52, 84, 39, 92, 63]
    [1, 3, 22, 27, 39, 52, 84, 97, 92, 63]
    [1, 3, 22, 27, 39, 52, 84, 97, 92, 63]
    [1, 3, 22, 27, 39, 52, 63, 97, 92, 84]
    [1, 3, 22, 27, 39, 52, 63, 84, 92, 97]
    [1, 3, 22, 27, 39, 52, 63, 84, 92, 97]
    
  • 相关阅读:
    洛谷mNOIP模拟赛Day2-星空
    洛谷mNOIP模拟赛Day2-将军令
    洛谷mNOIP模拟赛Day2-入阵曲
    洛谷mNOIP模拟赛Day1-斐波那契
    洛谷mNOIP模拟赛Day1-数颜色
    计蒜客NOIP2017提高组模拟赛(五)day1-展览
    HDU1700Points on Cycle(圆心半径)
    HDU1086You can Solve a Geometry Problem too (斜率问题)
    湖南省第十届大学生计算机程序设计竞赛1503: 点到圆弧的距离(atan()函数的应用)
    HDU献给杭电五十周年校庆的礼物 (切蛋糕,线段划分区域)
  • 原文地址:https://www.cnblogs.com/davis12/p/14535321.html
Copyright © 2020-2023  润新知