常用的排序方法:冒泡排序、选择排序、插入排序、快速排序、堆排序、归并排序

冒泡排序(Bubble Sort):

  比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  针对所有的元素重复以上的步骤,除了最后一个。
  持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

def bubble_sort(alist):
n = len(alist)
for i in range(n-1):
for j in range(n-1-i):
if alist[j] > alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
if __name__ == '__main__':
alist = [1,2,4,9,5,6,8]
bubble_sort(alist)
print(alist)

最优时间复杂度:O(n)
最坏时间复杂度:O(n2)

空间复杂度:o(1)
稳定性:稳定

  

选择排序(Selection sort):

  首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  然后,再从剩余未排序元素中继续寻找最小(大)元素,
  然后放到已排序序列的末尾。
  以此类推,直到所有元素均排序完毕。

def select_sort(alist):
n = len(alist)
for i in range(n-1):
min_index = i
for j in range(i+1,n): # 遍历无序序列
# 判断当前数值是否小于最小值,如果小于,则记录其索引
if alist[j] < alist[min_index]:
min_index = j
# 判断min_index索引是否相同,不相同,做数值交换
if i != min_index:
alist[i],alist[min_index] = alist[min_index],alist[i]
if __name__ == '__main__':
alist = [12,34,56,78,90,87,65,43,21]
select_sort(alist)
print(alist)

最优时间复杂度:O(n*log2n)
最坏时间复杂度:O(n2)

空间复杂度:O(log2n)~o(n)
稳定性:不稳定

插入排序:

    开始假定列表里下标为0的元素是最小,在后面还未排序的数据里依次选取数据在前面有序区域里做比较并放在正确的位置,就像我们在玩扑克牌的时候依次把扑克牌有顺序的拜访

import random
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i] #tmp是无序区取出的一个数
j = i - 1 #li[j]是有序区最大的那个数
while j >= 0 and li[j] > tmp:
# li[j]是有序区最大的数,tmp是无序区取出的一个数,tmp从有序区最大的那个数开始比
# 小就调换位置,直到找到有序区中值不大于tmp的结束
li[j+1]=li[j] #将有序区最右边的数向右移一个位置
j = j - 1
li[j + 1] = tmp #将tmp放到以前有序区最大数的位置,再依次与前一个数比较
data = list(range(100))
random.shuffle(data) #将有序列表打乱
insert_sort(data)
print(data)
时间复杂度:o(n2)
空间复杂度:o(1)
稳定性:稳定

快速排序:

  随机选取一个值,挨个跟后面的数值作比较,比该数值小的将放在左列表中,反之则放在右列表,返回形式为:左列表+[随机值]+右列表,左右列表使用递归的方式继续进行排序。

def quick(list):
if len(list) < 2:
return list
tmp = list[0] # 临时变量 可以取随机值
left = [x for x in list[1:] if x <= tmp] # 左列表
right = [x for x in list[1:] if x > tmp] # 右列表
return quick(left) + [tmp] + quick(right) li = [4,3,7,5,8,2]
print(quick(li)) 时间复杂度:O(nlog₂n)
空间复杂度:O(nlog₂n)
稳定性:不稳定

堆排:

  堆总是一棵完全二叉树,构造堆、调整堆

  构造堆:每个根节点总是大于等于其子节点,从最小堆依次往上做调整

  调整堆:将堆顶最大元素出堆,将最后一个元素放至堆顶,然后用构造堆的方法进行调整,此过程循环往复,将数据从大到小的顺序依次出堆,直至此堆变空。

  时间复杂度:O(nlogn)

  空间复杂度:O(1)

  稳定性:不稳定

归并排序:

  将列表越分越小,直至分成一个元素,一个元素是有效的,然后将两个有序的列表合并。

  时间复杂度:O(nlog₂n)

  空间复杂度:O(1)

  稳定性:稳定

整理自:https://www.cnblogs.com/xiaonq/p/8573587.html

  

  

  

python--8大排序(原理+代码)的更多相关文章

  1. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  2. Python十大经典排序算法

    现在很多的事情都可以用算法来解决,在编程上,算法有着很重要的地位,将算法用函数封装起来,使程序能更好的调用,不需要反复编写. Python十大经典算法: 一.插入排序 1.算法思想 从第二个元素开始和 ...

  3. 万字长文带你掌握Java数组与排序,代码实现原理都帮你搞明白!

    查找元素索引位置 基本查找 根据数组元素找出该元素第一次在数组中出现的索引 public class TestArray1 { public static void main(String[] arg ...

  4. Python有趣时刻,这些代码让你大呼"卧槽,怎么会这样"

    分享一个实用问题,用python读取Excel并保存字典,如何做? 下面是该同学问题截图和代码 image.png 代码截图是下面这样的 image.png 不知道大家第一眼看了这个代码,什么感受?我 ...

  5. python模块之HTMLParser(原理很大程度上就是对类构造的熟练运用)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser(原理很大程度上就是对类构造的熟练运用) import HTMLPar ...

  6. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  7. python与桶排序

    问题提出: 将以下数据: 6, 8, 2, 3, 4, 0, 9, 1, 5,1 按从小到达排列. 桶排序原理: 桶排序也叫计数排序,简单来说,就是将数据集里面所有元素按顺序列举出来,然后统计元素出现 ...

  8. 史上最详细的C语言和Python的选择排序算法

    未经同意,请勿转载!如有收货,请留一赞,不胜感激! 同时欢迎加入我们的qq交流群:326079727 话不多说上代码: C语言: //选择排序走起 //原理:吃透原理再去实现,选择排序也是类似于冒泡排 ...

  9. js十大排序算法详解

    十大经典算法导图  图片名词解释:n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 functi ...

  10. 谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

随机推荐

  1. C++ --const修饰指针

    const修饰指针 1.const修饰指针 (常量指针)常量的指针 const int *p = &a; const修饰的是*p(表示内容为常量),不是p(指针) 指针指向的地址可以改,但指针 ...

  2. Nginx代理前端代码

    Nginx 安装配置 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/ ...

  3. CentOS自动化安装LAMP脚本

    #!/bin/bash #-- #blog:lizhenliang.blog.51cto.com ########## function ########## depend_pkg () { yum ...

  4. Nginx基础知识点总结和优化项

    1.什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,常用于做负载均衡服务器 2.为什么要用Nginx?跨平台.配置简单非阻塞.高并发连接:处理2-3万并发连接数,官方监测能支持5 ...

  5. P3747 [六省联考2017]相逢是问候

    题意 如果对一个数操作\(k\)次,那么这个数会变成\(c^{c^{...^{a_i}}}\),其中\(c\)有\(k\)个. 根据P4139 上帝与集合的正确用法这道题,我们可以知道一个数不断变为自 ...

  6. vuex——action,mutation,getters的调用

    一.子模块调用根模块的方法 mutation调用  context.commit('clearloginInfo',{key_root:data},{root:true}); action调用  co ...

  7. Docker和ASP.NET Core

    Docker和ASP.NET Core Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持. (Microsoft 是支持 Docker ...

  8. Java描述设计模式(02):简单工厂模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...

  9. ZooKeeper(三):请求处理链路的创建过程解析

    我们知道,zk就是一个个处理链组成的. 但是,这些处理链是在什么创建的呢? ZooKeeper 中有三种角色的服务节点存在: Leader, Follower, Observer . 而每个服务节点的 ...

  10. 原生PHP网页导出和导入excel文件实例

    原生PHP实现的网页导出和导入excel文件实例,包括上传也是用的原生.还可在exportExcel方法里设置字体等表格样式. 导出和导入表单代码: <p style="margin: ...