第三课 排序算法LowB三人组

这是一篇关于Python排序算法的基础教程,涵盖了列表排序的概念,包括升序和降序排列。文章详细讲解了冒泡排序、选择排序和插入排序的原理、实现及时间复杂度分析。冒泡排序通过相邻元素比较交换实现,选择排序每次找出最小元素放置到已排序部分,而插入排序则是将新元素插入到已排序列表的正确位置。
摘要由CSDN通过智能技术生成

python数据结构与算法基础 第三课

tags:

  • python
  • 路飞学院

categories:

  • python
  • 排序算法
  • LowB 三人组
  • 冒泡排序
  • 选择排序
  • 插入排序

第一节 什么是列表排序

1. 列表排序介绍

  1. 排序:将一组“无序”的记录序列调整为“有序”的记录序列
  2. 列表排序:将无序列表变为有序列表。
  3. 输入:列表 输出:有序列表
  4. 升序与降序
  5. 内置排序函数: sort()
  6. 榜单、红黑榜、使用网站评率等
  7. 常见的排序算法如下
排序LowB三人组排序NB三人组其他排序
冒泡排序快速排序希尔排序
选择排序堆排序计数排序
插入排序归并排序基数排序

第二节 冒泡排序

1. 冒泡排序原理和实现

  1. 列表每两个相邻的数,如果前面比后面大,则交换这两个数。
  2. 一趟排序完成后,则无序区减少一个数,有序区增加一个数。
  3. 代码关键点:趟、无序区范围
    #!/usr/bin/env python3
    
    # 冒泡排序
    def bubble_sort(li):
        # 整个列表的循环是n-1趟
        # i=0 第一趟 无需区 len(li)-1
        # i=1 第二趟 无需区 len(li)-1-1
        # i=n-1 第n-1趟 无需区 len(li)-1-(n-1)
        # 第i趟 无序区的长度为len(li)-1-i
        for i in range(len(li)-1):
            for k in range(len(li)-1-i):
                if li[k] > li[k+1]:
                    li[k], li[k+1] = li[k+1], li[k]
    
    
    import random
    list = random.sample([i for i in range(1000)], 20)
    print(list)
    bubble_sort(list)
    print(list)

2. 冒泡排序改进和分析

  1. 时间复杂度: O(n^2)
  2. 如果一趟中列表排序中没有发生任何交换,我们可以认为列表已经是有序的了
  3. 可以加个标志位
    #!/usr/bin/env python3
    
    # 冒泡排序改进
    def bubble_sort_impro(li):
        for i in range(len(li)-1):
            exchange = False
            for k in range(len(li)-1-i):
                if li[k] > li[k+1]:
                    li[k], li[k+1] = li[k+1], li[k]
                    exchange = True
            if not exchange:
                return
    
    import random
    list1= [random.randint(0,1000) for i in range(20)]
    print(list1)
    bubble_sort_impro(list1)
    print(list1)

第三节 选择排序

1. 选择排序原理和实现

  1. 每次从列表中选出最小的数放到一个新列表中
  2. 时间复杂度: O(n^2)
    #!/usr/bin/env python3
    # 简单版选择排序
    def select_sort(li):
        li_new = []
        for i in range(len(li)):
            # 有重复的也没关系,会从左边找
            # min是0(n) remove是一个O(n)
            min_val = min(li)
            li_new.append(min_val)
            li.remove(min_val)
        return li_new

    import random
    list = random.sample([i for i in range(1000)], 20)
    print(list)
    li_new = select_sort(list)
    print(li_new)

2. 选择排序改进和分析

  1. 上述选择排序多占用了一份内存。空间复杂度变成2*n。
  2. 这不是必要的可以进行改进,避免掉
  3. 我把选择的出的数放在最前面的位置就可以了。最前面的数和选出的数交换
  4. 算法关键点:有序区和无序区、无序区最小数的位置
  5. 时间复杂度: O(n^2)
    #!/usr/bin/env python3
   # 改进版选择排序
    def select_sort_impro(li):
        for i in range(len(li)-1):
            # 假设最小值是无序区的第一个位置
            min_loc = i
            # 可以偷次懒 i 不需要和自己比拉
            for j in range(i+1, len(li)):
                if li[j] < li[min_loc]:
                    min_loc = j
            li[i], li[min_loc] = li[min_loc], li[i]

    import random

    list1= [random.randint(0,1000) for i in range(20)]
    print(list1)
    select_sort_impro(list1)
    print(list1)

第四节 插入排序

1. 插入排序原理和实现

  1. 初始时手里(有序区)只有- -张牌
  2. 每次(从无序区)摸一-张牌,插入到手里已有牌的正确位置
    #!/usr/bin/env python3
   # 插入排序
    def insert_sort(li):
        for i in range(1, len(li)): # i表示摸到的牌
            temp = li[i]
            j = i - 1 # j表示有序区的最后一张牌(手里的牌)
            while j >= 0 and li[j] > temp:
                li[j + 1] = li[j]
                j -= 1
            li[j + 1] = temp


    import random
    list = random.sample([i for i in range(1000)], 20)
    print(list)
    insert_sort(list)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 如果你在Ubuntu虚拟机上无法连接外网,可能有几个原因导致这个问题。首先,你需要确保你的虚拟机网络设置正确。你可以检查虚拟机的网络适配器设置,确保它与宿主机的网络适配器连接正常。其次,你可以尝试重启虚拟机或者重启网络服务来解决连接问题。你可以在Ubuntu命令行中输入"sudo service networking restart"来重启网卡。最后,你还可以尝试在虚拟机的网络设置中将虚拟网卡设置为自动获取IP地址,并勾选"use this connection only for resources on its network"选项。这样可以确保虚拟机能够正确连接到外部网络。\[2\]\[3\] #### 引用[.reference_title] - *1* [解决 Ubuntu 连接不上外网,无法ping主机地址。](https://blog.csdn.net/feel_myself_is_lowB/article/details/106410217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [ubuntu虚拟机网络配置同时连接WIFI上外网和连接以太网与ARM开发板通信](https://blog.csdn.net/meilante5190/article/details/105055964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值