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,一经查实,立即删除!

相关文章

AfxMessageBox和MessageBox差别

假设用MFC的话&#xff0c;请尽量使用afxmessagebox&#xff0c;由于这个全局的对话框最安全&#xff0c;也最方便。 可是在WIN32 SDK的情况下仅仅能使用MESSAGEBOX。 MessageBox()是Win32API函数.后者是mfc中的全局函数&#xff0e;在MFC中能用MessageBox()的地方都能用AfxM…

[单刷 APUE 系列] 第十四章——高级 I/O

非阻塞I/O 在最前面&#xff0c;我们讲过IO分成带缓冲的IO和不带缓冲的IO&#xff0c;但是实际上&#xff0c;这个区别并不是很大&#xff0c;因为缓冲区并没有影响到实际的读写。我们知道&#xff0c;系统调用实际上分成两种&#xff0c;高速的系统调用和低速的系统调用&#…

正则表达式的简单应用

1. 正则表达式(1) 什么是正则表达式&#xff1f;正则表达式是一种功能强大而灵活的文本处理工具。(2) 正则表达式的主要作用正则表达式主要用于&#xff1a;验证字符串&#xff0c;即检验输入的字符串是否符合给定的模式。例如&#xff0c;验证输入的电话号码、手机号码、号码等…

Prism区域异常问题分析(导航失效?)

前文本篇文章主要讨论在WPF当中使用Prism区域导航的失效的问题, 在其它的博客当中也出现了多次讨论这个问题以及对应的解决方法,例如重写OnInitialized方法等等。我认为这都不是解决问题的根源, 既然如此, 下面我们将来分析Prism的IRegionManager的具体流程。Prism初始化过程首…

HOOK学习笔记与心得

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

使用SQLServer2005插入一条数据时返回当前插入数据的ID

使用SQLServer2005插入一条数据时返回当前插入数据的ID在执行完插入后 再执行 select identity from users 就OK 就是刚才插入的那行的 ID了 补充&#xff1a; identity 表示当前新增的主键ID这个是在一个session中查找的&#xff0c;SELECT MAX(id) FROM Users 执行这个查询,就…

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

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

atitit。wondows 右键菜单的管理与位置存储

atitit。wondows 右键菜单的管理与位置存储 原理 。这样的功能称为Windows外壳扩展(Shell Extensions) 1 常用右键菜单 atiContentMenu1 通用tool1 文件夹的右键菜单位置3 所有的文件的右键菜单位置3 右键菜文件夹模式3 原理 。这样的功能称为Windows外壳扩展(Shell Extensions…

汇编语言之基础知识

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;在运行参数中进行密码设置&…

C# 对Datatable排序

一&#xff0c;在C#中要对Datatable排序&#xff0c;可使用DefaultView的Sort方法。先获取Datatable的DefaultView&#xff0c;然后设置 得到的Dataview的sort属性&#xff0c;最后用视图的ToTable方法将排好序的dataview导出为Datatable。 代码如下&#xff1a; …

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…

Android官方开发文档Training系列课程中文版:Android的安全建议 .

转载:http://blog.csdn.net/sahadev_/article/details/52949855 原文地址:http://android.xsoftlab.net/training/articles/security-tips.html Android系统内置的安全策略可以有效的降低应用程序的安全问题。所以默认创建的应用程序已经包含了一定程度的安全保护措施。 Andr…

PHP提取字符串中的数字

function number($str) {return preg_replace(/\D/s, , $str); } // echo 123456 echo number(Hello 123 world 456 !!); //支持小数 function number($str) { return preg_replace(/[^\.0123456789]/s, , $str); } 转载于:https://www.cnblogs.com/shcolo/p/5945192.html

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

文末有福利&#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…