分享好友 最新动态首页 最新动态分类 切换频道
几种排序算法的简单总结
2024-12-26 10:42

几种排序算法的简单总结

    离职总是很麻烦,老板人不错,得好好把工作对接完咯。晚上闲一下就写写博客。

    下面会讲到一些简单的排序算法(均基于java实现,并给出实现和效率分析。

    使用的基类如下

    注意:抽象函数应为public的,我就不改代码了

 

    最常见的,毕竟老师教给我们的的第一种排序算法。实现起来很简单,不过实际应用很少(正常情况下,复杂度O(n²)。

    原理

    趟一趟的比,每一趟中,循环剩余的数,和后一个进行比较,若比它小则交换。这样一趟下来最小的在第一个,最大的在最后一个。总共比n-1趟。

    实现

 

    优化

    上面的算法,无论的你的数据怎么样,始终都要比n²次,效率很低。若你的数据局部有序,经过几趟交换以后,已经有序,则不用继续往下比。效率会高很多(绝大多数情况下)。优化代码如下

 
 

    和冒泡复杂度一样O(n²),但是时间上可能会比冒泡稍微快一点,因为交换的次数比冒泡少。

    原理

    选择排序可以说是最好理解的算法。就是每次遍历一趟,找出最小的数,放到最前端。(这里说的是最前,是指无序的队列中的最前

    实现

 
 

    时间复杂度O(n²)。

    原理

    遍历未排序序列。把未排序数列的第一个数和已排序数列的每一个数比较,若比它大则交换。经典的理解方式就是理解成摸牌时候理牌的顺序。我上面的实现是直接交互数字,若是把大的数直接往后移效率还会更高。

    实现

 

    适合插入排序的数据

    当你的数据是基本有序的时候且数据量小,利用插入排序的时候,效率会很高。若数据为逆序的话,效率很低。

    可以看出是插入排序的一种优化,或者是预处理。希尔排序就是先进行h-sort,也就是让间隔为h的元素都是有序的。普通的插入排序就是1-sort。

    原理

    主要就是选定一个h的有序数组来进行预排序。这样最后进行插入排序的时候,能使数据局部有序。就算交换的话,交换的次数也不会很多。这样h序列称为递增序列。希尔的性能很大部分取决于递增序列.一般来说我们使用这个序列3x + 1.

    实现

 

    性能

    对于希尔排序的性能其实无法准确表示。介于O(nlogn)和O(n²)之间,大概在n的1.5次幂左右。

    希尔排序对于中大型数据的排序效率是很高的,而且占用空间少,代码量短。而且就算是很大的数据,用类似快排这种高性能的排序方法,也仅仅只比希尔快两倍或者不到。

    复杂度O(nlogn).

    核心思想就是采用分而治之的方法,递归的合并两个有序的数组。效率比较高,缺点是空间复杂度高,会用到额外的数组。

    原理

    核心代码是合并的函数。合并的前提是保证左右两边的数组分别有序,在合并之前和之后在Java中我们可以用断言来保证数组有序。合并的原理其实也很简单,先把a数组中的内容复制到额外储存的temp数组中去。分别用两个index指向a数组的起始位置和中间位置,保证a数组左右两边有序,比如i,j。现在开始从头扫描比较左右两个数组,若a[i]<=a[j],则把a[i]放到temp数组中去,且i向前走一步。反正则放a[j],且j走一步。若其中一个数组走完了,则把另一个数组剩余的数直接放到temp数组中。我们用递归的方式来实现左右两边有序。递归到数组只有1个数时肯定是有序的,再合并2个数,再退出来合并4个数,以此类推。

    实现

 

    优化

    归并排序对小数组排序时,由于会有多重的递归调用,所以速度没有插入排序快。可以在递归调用到小数组时改采用插入排序。小数组的意思是差不多10个数左右。

    如果递归时判断已经有序则不用继续递归。也可以增加效率。

 

    另外在合并时交互两个数组的顺序,能节省复制数组到辅助数组的时间,但节省不了空间。

    适用范围

    如果你对空间要求不高,且想要一个稳定的算法。那么可以使用归并排序。

    传说中最快的排序算法,听说能裸写快排,月薪可上10k...

    快排平均情况下时间复杂度O(nlogn),最糟糕情况O(n²)。O(n²)主要是因为选定的主元是极端值造成的,比如说最大值,最小值。不过这种情况一般很少出现,所以在进行快排之前我们需要对数组进行乱序,尽量避免这种情况的发生。

    原理

    第一步打乱数组。

    然后也是分治法。归并是先分再合并。快排是先排序再分别排序两边。

    排序过程核心思想是为了选出一个数,把数组分成左右两边,左边比主元小,右边比主元大。

    选定第一个数作为主元。然后设定两个index指向数组首尾,比如i,j。接着从两边向中间扫描,分别用a[i]和a[j]和主元比较。若两边位置不对则交换a[i]和a[j],比如说a[i]在扫描过程中遇到a[i]>主元,那么则停止扫描,因为我们需要左边的数小于主元,反正右边也一样等到a[j]也停下来,则交换a[i]和a[j]。

    得到中间的位置之后再分别左右递归排序。

    实现

 

    优化

    第一步的随机打乱数组,虽然会耗费一定时间,但却是必要的。同样的小数组的排序,快排不如插入排序。所以小数组可以直接采用插入排序。主元的选择方式可以有多种,比如随机选择主元。或者选取三个数,取中位数为主元,但是会耗费一定时间。

    适用范围

    虽然快速排序是不稳定的。但快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环很小。快速排序在对重复数据的排序时,会重复划分数据进行排序。虽然性能也还行,但这里可以进行改进,就是下面介绍的三向切分排序。

    快速排序的一种改进,使快排在有大量重复元素的数据,同样能保持高效。

    原理

    基本原理和快排差不多。三向切分的时候在划分数组时不是分为两组,而是分成三组。

  •     小于主元
  •     和主元相等
  •     大于主元

    实现

 
 

    时间复杂度O(nlogn),堆排序主要用二叉堆实现,在讲堆排序之前我们可以要先了解下二叉堆。

    二叉堆

    所谓的二叉堆用一颗二叉树表示,也就是每一个节点都大于它的左右子节点。也就是说根节点是最大的。

    二叉树用数组存储,可以用下标来表示节点。比如i这个节点的父节点为i/2,左儿子为2*i,右儿子为2*i+1.

    堆的操作主要有两种上浮和下沉。主要对应两种情况,比如在数组末尾添加节点,此时需要上浮节点,保证二叉堆的特点。反之在替换根节点是则需要下沉操作。

    原理

    分为两步。

  •     把数组排成二叉堆的顺序
  •     调换根节点和最后一个节点的位置,然后对根节点进行下沉操作。

    实现

    适用范围

    堆排序也是不稳定的。

    堆排序在空间和时间上都是O(nlogn),且没有最糟情况,但在平均情况下比快排慢。

    所以现在大部分应用都是用的快排,因为它的平均效率很高,几乎不会有最糟情况发生。

    但如果你的应用非常非常重视性能的保证,比如一些医学上的监控之类的。

    那么可以使用堆排序。还有一个堆排序的缺点,是它无法利用缓存,几乎很少和相邻元素的比较。

    使用下面的代码测试以上排序算法

 

    下面是本人的一次运行结果

最新文章
百度SEO已死_2021百度seo(百度seo sem)
1、1处理惩罚死链接的时间我们最好找到死链接自身所处的位置,然后在页面中手动删除2假如死链接太多我们可以利用robotstxt来屏蔽3利用工具提交死链,当网站死链数据累积过多时,可以把全部死链接整理放在一个文件内里,并把制作好的文件上
高清美女写真一键生成:探索最强AI绘画工具及操作指南
接下来,让我们详细介绍使用搜狐简单AI生成美女写真的步骤,保证大家都能轻松跟随操作。步骤一:访问搜狐简单AI小程序在微信中搜索“搜狐简单AI”小程序,点击进入。步骤二:选择生成类型进入后,选择“美女写真”选项。您会看到多个模板供
马克思主义学院举办2024年度大学生职业规划大赛
马克思主义学院学子积极参加,共有15名参赛选手。参赛选手们深入剖析自我,结合马克思主义理论专业特色,从教育、学术研究、党政机关等多领域规划职业路径。其中22思政张炎梦同学,规划一条完备的教师职业规划路线,从求职意向、个人能力、
反恐精英online:如何操作说话键及最新游戏内通讯功能介绍
本文目录导读:一、说话键操作二、最新游戏内通讯功能介绍三、注意事项在《反恐精英Online》中,操作说话键以及了解游戏内的通讯功能对于玩家来说至关重要,这有助于提升团队协作效率和游戏胜率,以下是对如何操作说话键及最新游戏内通讯功
火星人燃气灶客服人工24小时《今日汇总》 聚焦法学教育未来 500多位专家齐聚浙江“论剑”
火星人燃气灶统一维修热线电话《今日汇总》火星人燃气灶各热线号码2024已更新(2024已更新)火星人燃气灶维修电话:(1)400-965-8692(点击咨询)(2)400-965-8692(点击咨询)火星人燃气灶24小时热线(1)400-965-8692(点击咨询)(2)400-
保安调研报告
保安调研报告  随着人们自身素质提升,报告与我们的生活紧密相连,报告包含标题、正文、结尾等。那么什么样的报告才是有效的呢?下面是小编精心整理的保安调研报告,希望能够帮助到大家。  职工自己保安能力和意识的现状及对策当前,各
新网站外链建设:全面的规划与执行指南
引言外链建设对于搜索引擎优化 (SEO) 至关重要,它可以帮助新网站建立权威性、提高能见度并提升排名。制定一个全面的外链建设计划对于新网站的成功至关重要。本文将提供一个循序渐进的指南,介绍如何制定和实施有效的外链建设策略,从而提
解锁口红英文命名套路:数字编号与具体抽象联想的五大法则
解锁口红英文命名套路:数字编号与具体抽象联想的五大法则编号这种简单粗暴的命名方式是高端奢侈品牌的最爱,迪奥、YSL等大牌彩妆品牌也经常使用这种方式。编号法是大牌彩妆常用的方法之一 |图片来源:迪奥混凝土协会颜色主要用来寻找生活
雅马哈yamaha机器人报E12.522STD板24V电源电压下降
在高速旋转时,相电压呈似方形,大大的了步进电机高速矩频特点。步进电机电动机的转速与脉冲信号正相关,当脉冲信号为120Hz时,步进电机转速比为lr/min;评测满载转速比超出3000r/min这时,脉冲信号按某类设置规律性发生变化时,YAMAHA机
国产BA系统
国产BA系统XProSCADA软件为一款适用于楼宇自控及能源管理、系统集成的应用软件平台,结合BATWON品牌的硬件产品,国产BA系统厂家支持空调系统、送排风系统、给排水系统、变配电系统的集中管理和控制;国产BA系统支持水、电、暖、气等能量的
相关文章
推荐文章
发表评论
0评