码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python数据结构与算法6


    目录

    topk问题

    思路

    代码实现

     时间复杂度

    归并排序

    思路

    有序列表合并代码实现

     无序列表合并代码实现

     时间复杂度

    希尔排序

    思路

    代码实现

    时间复杂度


    topk问题

    思路:

    1.取前k个元素建立一个小根堆,堆顶就是目前第k的的数

    2.依次向后遍历源列表,根据大小替换元素,并调整堆

    3.倒序弹出堆顶

    代码实现:

    1. def sift(li,low,high): #low根节点 high最后一个节点
    2. i=low #i开始指向根节点
    3. j=2*i+1 #j是左孩子
    4. tmp=li[low] #堆顶的值
    5. while j<=high:
    6. if j+1<=high and li[j+1]>li[j]:
    7. j=j+1
    8. if li[j]>tmp:
    9. li[i]=li[j]
    10. i=j
    11. j=2*i+1
    12. else:
    13. li[i]=tmp
    14. break;
    15. else :
    16. li[i]=tmp
    17. def topk(li,k):
    18. heap=li[0:k] #取前k个元素建立一个小根堆,堆顶就是目前第k的的数
    19. for i in range((k-2)//2,-1,-1):
    20. sift(heap,i,k-1)
    21. for i in range(k,len(li)-1): #依次向后遍历源列表,根据大小替换元素,并调整堆
    22. if li[i]>heap[0]:
    23. heap[0]=li[i]
    24. sift(heap,0,k-1)
    25. for i in range(k-1,-1,-1): #倒序弹出堆顶
    26. heap[0],heap[i]=heap[i],heap[0]
    27. sift(heap,0,i-1)
    28. return heap
    29. import random
    30. li=list(range(100))
    31. random.shuffle(li)
    32. print(topk(li,10))

     时间复杂度:

    o(nlogn)

    归并排序

    思路:

    1.首先一次合并,前提是两边的列表都有序,将左右两边的数字挨个比较,顺序加入一个列表

    2.两边的列表无序时,使用递归排好序,再使用1中的方法

    有序列表合并代码实现:

    1. def merge(li,low,mid,high):
    2. i=low
    3. j=mid+1
    4. ltmp=[]
    5. while i<=mid and j<=high: #左右两边都有数
    6. if li[i]
    7. ltmp.append(li[i])
    8. i+=1
    9. else:
    10. ltmp.append(li[j])
    11. j+=1
    12. while i<=mid:
    13. ltmp.append(li[i])
    14. i+=1
    15. while j<=high:
    16. ltmp.append(li[j])
    17. j+=1
    18. li[low:high+1]=ltmp
    19. return li
    20. li=[2,4,5,7,1,3,8,9]
    21. print(merge(li,0,3,7))

     无序列表合并代码实现:

    1. def merge_sort(li,low,high):
    2. if low
    3. #至少有两个元素
    4. mid=(low+high)//2
    5. merge_sort(li,low,mid)
    6. merge_sort(li,mid+1,high)
    7. merge(li,low,mid,high)
    8. li=list(range(10))
    9. import random
    10. random.shuffle(li)
    11. print(li)
    12. merge_sort(li,0,len(li)-1)
    13. print(li)

     时间复杂度:

    o(nlogn)

    希尔排序

    思路:

    1.实质是一种分组插入排序

    2.通过设置gap将列表分组,延用插入排序的代码,但gap代替了两个数之间的距离

    3.当gap<1时排序结束

    代码实现:

    1. #实质是一种分组插入排序
    2. def insert_sort_gap(li,gap):
    3. for i in range(gap,len(li)):
    4. tmp=li[i]
    5. j=i-gap
    6. while li[j]>tmp and j>=0:
    7. li[j+gap]=li[j]
    8. j-=gap
    9. li[j+gap]=tmp
    10. def shell_sort(li):
    11. d=len(li)//2
    12. while d>=1:
    13. insert_sort_gap(li,d)
    14. d//=2
    15. li=list(range(10))
    16. import random
    17. random.shuffle(li)
    18. print(li)
    19. shell_sort(li)
    20. print(li)

     时间复杂度:

    较为复杂,与gap的选取有关

     

  • 相关阅读:
    docker下快速部署openldap与PHPLdapAdmin
    实时数仓:美团点评Flink的实时数仓应用分享
    【每日一练】python之sum()求和函数实例讲解
    refseq数据库的特点_eureka如何剔除服务
    如何在excel表中实现单元格满足条件时整行变色?
    使用 Hugging Face Transformer 创建 BERT 嵌入
    发送邮件配置
    面具安装LSP模块时提示 Unzip error错误的解决办法
    智慧家庭中的人体动作识别研究综述
    【MySQL基础篇】MySQL数据库安装教程
  • 原文地址:https://blog.csdn.net/qq_62262691/article/details/126325280
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号