冒泡排序,选择排序,插入排序

简介: 冒泡排序,选择排序,插入排序

冒泡排序

时间复杂度 O(n2)


# 冒泡排序
#   列表每相邻的数,如果前面比后面大,则交换这两个数
#   一趟排序完成后,则无序区减少一个数,有序增加一个数
import random
def bubble_sort(li):
   for i in range(len(li)-1):
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
# 优化
# 当数据不再交换的时候,排序已经完成,就可以结束循环,减少时间
from cal_time import cal_time
def bubble_sort(li):
    for i in range(len(li)-1):
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            return
# 测试
# 使用random随机模块
# 列表生成式
li =[random.randint(1,10000) for i in range(1000)]
print(li)
bubble_sort(li)
print(li)
lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
bubble_sort(lit)


选择排序

时间复杂度 O(n2)


# 选择排序
# 简陋写法
# 确定,时间复杂度高,空间复杂度高 非原地排序
import random
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
# 优化
# 算法关键: 有序区和无序区, 记录无序区最小数的位置
def select_sort(li):
    for i in range(len(li)-1):
        min_loc = 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]
lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
select_sort(lit)


插入排序

时间复杂度 O(n2)


# 插入排序 时间复杂度为O(n*n)
'''
将所有的元素看成扑克牌,选则排序就象对摸到的扑克牌进行排序一样, 第一个元素看成底牌,后面的元素为未知的
每次摸一张牌 从右向左依次比较,当所摸得牌大于比较所比较的牌 将摸到的牌放在所比较的牌的右面
当所摸得牌小于比较所比较的牌,所比较的牌向右移动一个位置,腾出位置,然后继续进行比较,
'''
import random
from cal_time import *
@cal_time
def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i-1
        # 找插入的位置
        # 从右往左比较,如果tmp小于l[j],l[j]他的位置就向右移一个位置,
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j = j-1
        li[j+1] = tmp
li = [1,5,9,6,4,9,4,5,5,9,4,6]
insert_sort(li)
print(li)
lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
insert_sort(lit)


相关文章
|
负载均衡 安全 应用服务中间件
什么是正向代理和反向代理
正向代理是客户端与服务端之间的中介,用于访问受限资源,如V/P/N和动态IP代理,同时可隐藏客户端IP。反向代理则接收客户端请求并转发给后端服务器集群,隐藏真实服务器信息,常用于堡垒机和负载均衡,如nginx。正向代理焦点在客户端,反向代理关注服务端。
|
3月前
|
数据采集 人工智能 数据可视化
GitHub 15.8k star 狂涨 DeerFlow,AI + 搜索 + 报告输出一次搞定!
DeerFlow 是字节跳动开源的深度研究框架,集成语言模型、搜索爬虫与代码执行工具,支持自动化完成复杂研究任务并生成多模态报告。具备多智能体协作、强搜索能力、Python 数据分析及可视化、报告自动生成等功能,适用于学术研究、内容创作与企业分析,部署灵活,社区活跃。
319 2
|
3月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
253 0
|
编解码 自然语言处理 数据可视化
阿里云百炼产品月刊【2024年10月】
阿里云百炼产品月刊【2024年10月】上线,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。本月推出开源图片解析模型qwen2-vl-7b-instruct和qwen2-vl-2b-instruct,提升图片理解能力;主流模型qwen-max、qwen-turbo和qwen-plus升级至快照0919版本,支持8千字长文本输出;新增应用观测功能,实时查看调用次数和应用时延。此外,还发布了《阿里云百炼产品动态》电子书以及阿里云百炼产品最新规划电子刊,汇集最新产品动态和实践案例。
1048 0
|
机器学习/深度学习 自然语言处理 计算机视觉
【YOLOv8改进 - Backbone主干】VanillaNet:极简的神经网络,利用VanillaNet替换YOLOV8主干
【YOLOv8改进 - Backbone主干】VanillaNet:极简的神经网络,利用VanillaNet替换YOLOV8主干
|
11月前
|
监控 数据可视化 数据挖掘
工时管理:团队为什么要做工时管理?
工时管理不只是单纯地记录时间,而是要通过精确地采集数据、灵活地安排工作、有效地配置资源、透明地进行监控,还有灵活地做出调整,来帮企业把工作效率提上去,把成本控制住,让员工更满意。
239 4
工时管理:团队为什么要做工时管理?
|
网络协议 程序员 数据安全/隐私保护
LabVIEW在两台计算机之间传输数据
LabVIEW在两台计算机之间传输数据
278 0
|
Shell Python
Python 的 os 库的应用实例
Python 的 os 库的应用实例
193 3
|
存储 NoSQL 调度
Redis的有序集合(Sorted Set)详解
Redis的有序集合(Sorted Set)详解
477 0
探究Python中的函数与模块
在本篇文章中,我们深入探讨了Python中的函数与模块。从函数的定义、参数处理,到模块的导入、自定义模块和包的使用,您已经掌握了如何通过这些工具来编写结构化、模块化的代码。 在实际开发中,合理地使用函数和模块可以大大提高代码的可读性和可维护性,为您编写更复杂的程序奠定了基础。