arraylist从大到小排序_经典排序方法的python实现和复杂度分析

1.冒泡排序:
冒泡排序算法的运作如下:

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

def bulle_sort(a):for i in range(0,len(a)-1):  # 外层循环for j in range(0,len(a)-1-i):  #每层循环所需要的操作if a[j]>a[j+1]:  # 比较两个元素的大小a[j],a[j+1]=a[j+1],a[j]  # 交换位置,便可得到当此循环的最大值,并放到最后
1aef50f263ac850e0559a02a96b92863.gif

时间复杂度
最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
最坏时间复杂度:O(n2)
稳定性:稳定

2.选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

def select_sort(a):for i in range(0,len(a)-1):for j in range(i+1,len(a)):if a[i]>a[j]:a[i],a[j] = a[j],a[i]  # 找到最小的,然后进行交换

时间复杂度
最优时间复杂度:O(n2) # 因为每次都是进行完全遍历,不管是否先排好序
最坏时间复杂度:O(n2)
稳定性:不稳定(考虑升序每次选择最大的情况)

90699db634e1390e45bf232fd0578959.gif

3.插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

def insert_sort(a):for i in range(1,len(a)):for j in range(0,i):  # 这里是从前面插入,当然,这里也可以从后面插入,只需要把j从大到小,后面的if条件也相反就可以if a[j]>a[i]:a[j],a[i] = a[i],a[j] # 将元素插入到前面排好序的数据中

时间复杂度:
最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
最坏时间复杂度:O(n2)
稳定性:稳定

2f045f197775c35dd99d140cc48412c1.gif

4.快速排序
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤为:

从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

def quick_sort(a,start=0,end=len(a)-1):#设置基准# start = 0# end = len(a)-1if start>end:returncur = a[start]  # 设置判定基准while start

时间复杂度
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(n2)
稳定性:不稳定

7d8ff002c3e01b5241660889286a5cd0.gif

5.希尔排序
希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。

def shell_sort(a):# 设定插入的长度n = len(a)length = n//2# 进入循环体while length>0:for i in range(length,n):j = iwhile j>length and a[j-length]>a[j]:  # 相当于进行列排序a[j-length],a[j] = a[j],a[j-length]j -= length# 更新步长length = length//2

时间复杂度
最优时间复杂度:根据步长序列的不同而不同
最坏时间复杂度:O(n2)
稳定想:不稳定

e0f49b1b42afae22865db51517529344.gif

6.归并排序
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

def merge_sort(a):# 设置递归的终止条件if len(a)<=1:return a# 拆开n = len(a)//2left = merge_sotr(a[0:n])right = merge_sort(a[n:])# 进行合并return merge(left,right)def merge(left,right):cur_left = 0cur_right = 0result = []# 将排序好的两个列表进行合并排序:while cur_left

时间复杂度
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
稳定性:稳定

342d04f034d85c19a877aa3e9831a3bc.gif

常见排序算法效率比较

f4e5e47228c40840061268fe0c4481f6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOOK学习笔记与心得

一、 Hook介绍钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理wind…

access函数_ACCESS中的DLookUp函数是如何运算的?

​一、DLookUp函数介绍1. DLookUp函数的用途&#xff1a;可以用于从指定集合(一个域)中获取符合条件的特定字段的值。2. DLookUp函数的格式为&#xff1a;DLookUp( expr , domain , [criteria] )其中&#xff1a;expr 为字段名&#xff0c;或以字段名为基础的表达式字符串domai…

汇编语言之基础知识

1、机器语言 说到汇编语言的产生&#xff0c;首先要讲一下机器语言。机器语言是机器指令的集合。什么是机器指令&#xff1f;我们在使用CE时&#xff0c;常常见到。 请看下图&#xff1a; 图中所示的就是机器指令&#xff08;或称机器码&#xff09;&#xff0c;这是十六进制的…

Entity Framework 简单增删改操作

前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作&#xff0c;现在主要来学习一下简单的增加、删除、修改操作。 增加 在EF中添加操作一般有两种方式&#xff1a;一是直接创建对象&#xff0c;然后调用“DbSet”的”Add()”…

华为云服务器初探二(完结)

在上一篇《华为云服务器初探》 中介绍了在使用华为云服务器部署时的一些关键点&#xff0c;本篇继续&#xff0c;内容涉及如下:中间件的部署问题解决NAT 网关使用数据库服务的访问dotNET Core 程序的构建Redis首先更正上一篇中的一个错误&#xff0c;在运行参数中进行密码设置&…

for in for of区别_Python 第5课:for…in循环黄金搭档之列表

乐学趣学Py● 05&#xff1a;for…in循环黄金搭档之列表●Python趣味小百科Python程序中有一个有彩蛋&#xff0c;在IDLE Pythton模式下输入import this会出现一首(The Zen of Python, by Tim Peters)‘Pyton之禅’的小诗。这首小诗表明了用Python编写代码时遵循的原则&#xf…

开源虎墩同名电影《小虎墩大英雄》定档大年初一

文末有福利&#xff0c;记得看到最后哦~| 作者&#xff1a;虎虎生风的开源虎墩组| 编辑&#xff1a;刘雪洁| 责编&#xff1a;王玥敏开源虎墩诞生记&#xff1a;小源机器人2.0大家还记得 2020 疫情肆虐的时候开源社与来自全国各地的开源爱好者隔空合作&#xff0c;共同打造的疫…

HYDRAstor:可扩展的二级存储

为什么80%的码农都做不了架构师&#xff1f;>>> 原文&#xff1a;HYDRAstor: a Scalable Secondary Storage. HYDRAstor&#xff08;官网&#xff09;是NEC推出的二级存储系统,先后有多篇关于HYDRAstor的论文发表在FAST&#xff08;包括后来9livesdata发表的论文&a…

汇编语言之寄存器(CPU工作原理)

1、介绍 一个典型的CPU&#xff0c;由运算器、控制器、寄存器等器件组成&#xff0c;对于游戏修改者来说&#xff0c;重点学习寄存器&#xff0c;其它不必管。 不同的CPU&#xff0c;寄存器的个数、结构是不相同的&#xff0c;8086CPU有14个寄存器&#xff0c;每个寄存器有一个…

学好英语网首页制作_没有美术基础的新手小白,如何学好淘宝美工?

没有美术基础的新手小白&#xff0c;如何学好淘宝美工&#xff1f;俗话说&#xff1a;万事开头难&#xff0c;没有任何基础、没有美术基础学淘宝美工&#xff0c;要怎么学习好呢&#xff1f;显然&#xff0c;作为一名没有美术基础的新手小白&#xff0c;一般开始学习的时候都是…

14岁上中科大,18岁攻读麻省博士,28岁成为哈佛最年轻副教授,“华人女天才”的开挂人生...

全世界只有3.14 % 的人关注了爆炸吧知识哈佛年纪最小的副教授是中国人1997年美国颁发的罗伯特里得奖获得者蔡天西&#xff0c;22岁获国际生物统计学协会颁发的极大成就"半参数随机"奖&#xff0c;28岁成为哈佛最年轻的女性副教授&#xff0c;香港、美国、著名学术刊物…

汇编语言之寄存器(内存访问)

1、内存中字的存储 2、ds和【address】 CPU要读写一个内存单元的时候&#xff0c;必须先给出这个内存单元的地址&#xff0c;在8086CPU中&#xff0c;内存地址由段地址和偏移地址组成&#xff0c; 其中&#xff0c;段地址存放在段寄存器DS中&#xff0c;DS称作数据段寄存器。…

用sort()方法随机打乱数组

2019独角兽企业重金招聘Python工程师标准>>> 我们先看一下随机数组排序的示例&#xff0c;再来研究其中的原理。 随机数组排序示例 var numbers [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; numbers numbers.sort(function(…

Linux下部署Kubernetes+Kubesphere(一)Kubernetes基础

1.服务器规划为配置Kubesphere高可用集群&#xff0c;需要三台或三台以上机器作为Master节点&#xff0c;每台机器既可以作为Master也可以作为Worker节点。其中Master节点数量建议为单数。该示例中采用三台服务器&#xff0c;即作为Master节点也作为Worker节点&#xff0c;配置…

触发器及其应用实验报告总结_调机技巧总结: 先快后慢射胶法及其应用

戳我进入社区&#xff1a;注塑和模具人的网上家园先快后慢&#xff0c;也即先用一级快速射胶&#xff0c;射到某个设定的位置时&#xff0c;再起二级慢速射胶。这个二级起级点一般是设在射胶充型的后期&#xff0c;也即接近充型结束的位置。使用一级快速射胶&#xff0c;可以保…