Python里面几种排序算法的比较,sorted的底层实现,虽然我们知道sorted的实现方式,但是却写不出这样的速度

简介:

算法与数据结构基础

原文链接:http://note.youdao.com/noteshare?id=7b9757930ce3cc9e0a5e61e4d0aa9ea2⊂=2726FFA02ADE4E74A302D8DA7646FB46

查找算法:

二分查找法:

简介:二分查找法又被称为折半查找法,用于预排序的查找问题

过程

  1. 如果在列表a中查找元素t,先将列表a中间位置的项与查找关键字t比较,如果两者相等,则成功。
  2. 否则,将表分为前后两个子表
  3. 如果中间位置大于t,则进一步查找前一子表,否则,查找后一子表
  4. 重复上述过程

优劣

  1. 时间复杂度为O(log~2~N),比较快
  2. 缺点就是必须是有序列表

排序算法:

冒泡排序

简介:两两比较大小,如果不满足升序关系,则交换

过程:略

优劣:

  1. 时间复杂度为O(N^2^),速度较慢
  2. 稳定

选择排序

简介:找出最小值,然后放入一个新的列表中

过程:略

优劣:

  1. 时间复杂度为O(N^2^),速度较慢
  2. 稳定

插入排序法

简介:依次检查需要排序的列表,每次取出一个元素放入另一个排好序的列表中的适当位置。

过程:略

优劣:

  1. 时间复杂度为O(N^2^)
  2. 速度不稳定,最佳情况为线性增长,最差情况为N^2^,所以速度实际上比前两种快

归并排序

简介:分而制之的思想

过程

  1. 将包含N个元素的列表分为两个含N/2元素的子列表.
  2. 对两个子列表递归调用归并排序(最后将两个子列表分解为N个子列表)。
  3. 合并已排序好的列表。

优劣::速度较快且稳定,时间复杂度为O(Nlog~2~N)

实现代码:

def merge(left,right):
    merged = []
    i,j = 0,0
    left_len,right_len = len(left),len(right)
    while i<left_len and j<right_len:
        if left[i] <= right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1
        merged.extend(left[i:])
        merged.extend(right[j:])
        return merged

def mergeSort(a):
    if len(a) <= 1:
        return a
    else:
        mid = len(a) // 2
        left = mergeSort(a[:mid])
        right = mergeSort(a[mid:])
        merge(left,right)
        return merge(left,right)

def main():
    a = [59,12,77,64,72,69,46,89,31,9]
    a1 = mergeSort(a)
    print(a1)

if __name__ == '__main__':
    main()

快速排序 #:

简介:对冒泡排序的改进

过程

  1. 设置两个变量i和j,作为列表首末两端的下标,即i=0,j=N-1
  2. 设置列表的第一个元素作为关键数据,即key=A[0]
  3. 从j开始向前搜索,找到第一个小于key的值A[j],将A[j]和A[i]互换
  4. 从i开始向后搜索,找到第一个大于key的值A[i],将A[i]和A[j]互换
  5. 重复3~4步,直到i = j

优劣:

  1. 平均情况时间复杂度为O(Nlog~2~N),比较快。
  2. 最差情况下时间复杂度为O(N^2^)

Python语言中提供的排序算法

内置数据类型list的方法sort(),内置函数sorted()

这个的底层实现就是归并排序,只是使用了Python无法编写的底层实现,从而避免了Python本身附加的大量开销,速度比我们自己写的归并排序要快很多(10~20倍),所以说我们一般排序都尽量使用sorted和sort

目录
相关文章
|
安全 搜索推荐
网站快照收录被黑客攻击劫持跳转
我们普通用户一般很难发现,今天有一个客户咨询我,说为什么他的一个网站的信息显示在一个菠菜网站上?我说这是人家利用了你的网站数据后被搜索引擎收录而留下的一个快照,快照是你的信息,打开却是违法信息,还有一种情况是快照是非法信息,而打开却是正常的网站信息,这种情况一般是网站被挂马或者域名遭到了劫持,在你 site搜索某个网站域名的时候,发现标题描述关键词全部被改掉了,点击以后会进入一个非法的网站页面,它替换掉了你被搜索引擎收录的快照信息并做了跳转,如果你自己在浏览器地址栏输入网址进去,并不会发现问题的所在,这种情况并不会直接破坏掉你网站的信息。
网站快照收录被黑客攻击劫持跳转
|
XML Shell API
【KVM虚拟化】· virsh管理命令
【KVM虚拟化】· virsh管理命令
933 0
|
移动开发 小程序 JavaScript
uniapp开发打包ios应用踩坑记
iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,这个编码,我们称之为识别码,也叫做UDID
|
开发工具 git C++
VS Code配置git推送代码
在VS Code中使用git相关插件实现项目代码到远程仓库(github)的推送和拉取。
1414 2
VS Code配置git推送代码
|
Ubuntu Windows 开发工具
|
物联网 测试技术 数据安全/隐私保护
|
网络协议 程序员
TCP报文格式全解析:网络小白变高手的必读指南
**TCP报文格式详解摘要** 探索TCP,传输层的关键协议,提供可靠数据传输。报文含源/目的端口(标识应用),32位序号(跟踪字节顺序),确认序号(确认接收),4位首部长度,6位标志(URG, ACK, PSH, RST, SYN, FIN),窗口大小(流量控制),检验和(数据完整性),紧急指针(优先数据)及可变长选项(如MSS, 时间戳)。了解这些字段,能更好地理解TCP连接的建立、管理和数据交换。
2216 3
|
存储 人工智能 缓存
官宣开源|阿里云与清华大学共建AI大模型推理项目Mooncake
2024年6月,国内优质大模型应用月之暗面Kimi与清华大学MADSys实验室(Machine Learning, AI, Big Data Systems Lab)联合发布了以 KVCache 为中心的大模型推理架构 Mooncake。
|
图形学 容器
【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏3(附项目源码)
【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏3(附项目源码)
1090 0

热门文章

最新文章