7大排序时间复杂度对比、以及优化
数据结构:计算机组织存储数据的方式
算法:作用于特定数据集上的算法流程
如何衡量一个排序算法的优劣?
1.算法的执行效率
-要看最好、最坏、平均时间复杂度
-有时候个数n太少也要考虑时间复杂度的系数、低阶、常数(冒泡和插入)
-比较或交换的次数
2.算法的内存消耗
-通过空间复杂度来衡量
-原地排序:特指空间复杂度为O(1)的排序算法(就是给定有限个数的空间)
3.算法的稳定性【重点】
-稳定性:若待排序的集合中存在值相等的元素,经过排序之后,相等元素之间原有的顺序是否改变,若未改变则稳定性排序。
//也就是看两个值相等的话,要不要进行排序,或是不改变它们跳到下一次比较。
栗子:订单排序中,如何按照金额排序后,相同金额的时间也是按顺序的?
解决:先按照时间排序,再按照金额稳定性排序
排序的分类:【7种】
动图解释原理[这里]
内部排序(默认)
排序过程无需借助外部存储器(磁盘),所有操作均在内存中完成。
- 插入排序
-直接插入排序:
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
-希尔排序
时间复杂度:O(n1.5~n2)
空间复杂度:O(1)
稳定性:根据具体代码 - 选择排序
-选择排序:
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定
-堆排序(二叉树)
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定 - 交换排序
-冒泡排序:
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定
-快速排序(分治思想)
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定 - 归并排序
-归并排序(分治思想)
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:稳定
------------------------掌握思想、会写、会分析两个复杂度---------------------------
外部排序
若参与排序的元素过多,数据量过大,内存放不下,需要借助外部存储器进行。(桶排序)
【无论是内部排序还是外部排序,最终数据的排序一定在内存中进行。】
1.冒泡排序
只操作相邻的两个元素,每次对相邻的两个元素做大小比较,看是否满足大小关系,不满足则交换,每次操作都保证至少有一个元素移动到最终位置
优化:设置标志位,在n次循环并没有元素交换,表示排序完毕跳出循环。
时间复杂度:
最好情况:o(n)
最坏情况:O(n^2)
平均复杂度:O(n^2)
空间复杂度:O(1)
-没有开辟新的空间
-所以冒泡排序是一个原地排序
稳定性:稳定
2.直接插入排序
基于有序数组元素的插入而来。
适用:近乎有序的集合。
思想:将待排序数据分为两个区间,已排序区间和待排序区间。
步骤:一开始已排序区间只有一个元素
首先找到要插入的位置,再将数据插入到特定位置,保持数组的有序性。
从后向前,若是比插入数大,则往后退一位。若比插入数小,则直接插入后面。
直到找到比它小的,插入到其后。
时间复杂度:
最好情况:o(n)
最坏情况:O(n^2)
平均复杂度:O(n^2)
空间复杂度:O(1)
-没有开辟新的空间
-所以冒泡排序是一个原地排序
稳定性:稳定
优化:折半插入排序,时间减少一半。
冒泡排序和直接插入排序的复杂度一样
为什么实际上用直接插入更多?
在万数量级 冒泡:100ms+ 插入:10ms+
在十万数量级 冒泡:15000ms+ 插入:800ms+
原因:交换次数
冒泡-交换3次
插入-交换1次
3.希尔排序
相比直插,优化了搬运的速率
类似于直插排序
找出未排序集合最小值,放到第一位
时间复杂度:
最好情况:o(n)
最坏情况:O(n^2)
平均复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定
所以插入和选择优先插入,因为其稳定性,且二者效率相差不大
4.归并排序
分治思想: 将一个大的问题分成n个足够小的问题,当所有小问题解决后,将结果合并起来就是整个问题的求解。
所有能使用分治思想解决的问题均可利用递归的技巧完美解决。
时间复杂度:
平均复杂度:O(nlogn)
O(n)是merge函数的 O(logn)是分组函数的
空间复杂度:O(n)
临时数组在合并后空间会释放
稳定性:取决于合并函数的写法 arr[i] <= arr[j]
5.快速排序
最重要的算法之一
基于分治思想
思想 : 从待排序的数组中任取一个任意元素,称为分区点,开始遍历过程,每当发现小于分区点的元素放到分区点左边,反之。每遍历一遍会把基准值放在最终位置。
最坏情况:
当待排序元素近乎有序时,若选取的元素恰好为最大值则整个树只有左子树,即成了一个O(n),此时时间复杂度退化为O(n^2)
最好情况:
每次的分区点都是中间元素,即左右子树差不多,O(nlogn)
平均:
O(nlogn)
空间复杂度:O(1)【原地排序】
稳定性:不稳定算法
优化:
问题:基准值的选取每次都选最大值或最小值,都大于或者小于基准值,整个树只有左子树。O(n^2)
解决:随机选取基准值
int random = (int)(Math.random()*(end-start+1)+start);
swap(array,random,start);
问题:当待排序集合包含大量重复元素时,与基准值相等的元素太多,整个数又只有右子树。O(n^2)
解决:二路快排。将大于和小于key的元素放在数组两端,i不断向后,j不断向前。i小于key,i++。j小于等于key,j–。否则和两端交换。直到i>j停止。
思考:
在O(n)之内找到一个无序数组的第k大值?
若走完一遍后i+1 = k;那么array[i+1]就是第k大的数。
若是 i+1 < k,在i+1右边找。
若 i+1 >k,在i+1左边找。
6.选择排序
思想 : 遍历未排序区域选择一个最小的值和区域中第一个元素交换,并把第一个元素放到已排序区域中,直到未排序区域没有元素。
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定
7.堆排序
思想 : 先取基准数建立一个堆,取堆顶元素后将剩余元素组成一个新堆,重复直到取出所有元素。
注意这个堆构成完全二叉树,且这个树所有非终端点的值不大于或者不小于其左右子树。也就是说根节点是当时的最大值或最小值。
也是利用了递归思想,先排再取。
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定
O(n^2) : 插排、冒泡、选择
运用递归 : 归并、快排、堆排
O(nlogn) : 归并、堆排、快排(时间复杂度不稳定:当快排最坏的情况,时间复杂度变为O(n^2))
不稳定排序 : 希尔、选择、快排、堆排
稳定排序 : 直插 、 冒泡 、 归并
7大排序时间复杂度对比、以及优化相关推荐
- 【十大排序算法】(一)冒泡排序算法(优化)
一.优化第一版 优化第一版是针对类似 int[] arr = {3,2,1,4,5,6,7,8,9; 这样的有很多已经排好序的数组,为了不让它做无用的循环,对于此场景进行的优化,优化代码如下: // ...
- 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话 ...
- 数据结构各大排序整理+动图演示+代码实现(Java)
注: 以下部分动图来源于:http://www.west999.com/info/html/chengxusheji/Javajishu/20190217/4612849.html 以下两幅图来自马士 ...
- 十大排序算法(C++)(时间复杂度O(nlogn)篇:希尔排序、堆排序、快速排序、归并排序)
希尔排序 希尔排序本质上是对插入排序的一种优化,它既有插入排序的简单,同时也解决了插入排序每次只交换相邻两个元素的缺点.插入排序过程如下: 1.将数组按照一定的间隔分为多个子数组(每跳跃一定间隔取一个 ...
- 排序算法——十大排序算法总结与对比
一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...
- 通过实验对比十大排序算法
通过实验对比十大排序算法 前面给出了所有算法的实现,代码实现可能还有优化的空间,但也可以通过这些算法来实验大致分析每一种算法的优劣. 文章目录 通过实验对比十大排序算法 实验环境 一.各个排序算法运行 ...
- 算法基础-十大排序算法及其优化(文末有抽奖福利哦)
算法基础-十大排序算法及其优化 算法基础-十大排序算法及其优化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kw1LA5Q4-1607527572080)(/uplo ...
- 十大经典排序算法解析及优化
前言 在上篇文章<十大经典排序算法(动图演示)>中,已经能够了解各种排序算法的思想逻辑,虽然其中提供了代码,但对其解析却并不够全面,而且使用的是js来进行编写演示.本人根据其上代码转换为P ...
- 各种排序算法的时间复杂度对比
各种排序算法的时间复杂度对比 排序算法 最坏时间复杂度 平均时间复杂度 最优时间复杂度 空间复杂度 稳定性 冒泡排序 O(n^2) O(n^2) O(n) O(1) 稳定 插入排序 O(n^2) O( ...
- 八大排序算法时间复杂度对比
八大排序算法时间复杂度对比
最新文章
- OpenAI新发现:GPT-3做小学数学题能得55分,验证胜过微调!
- 多媒体制作技术心得体会_论多媒体教学的改革与创新
- 实战:搭建CA认证中心,使用CA证书搭建HTTPS
- dos命令 cd命令使用说明[图文说明]
- ssm mysql增删改查_SSM配置并实现简单的数据库增删改查操作
- Atitit 通用服务端代理接口 转接口 attilax总结
- 黄大刀 :机房建设主要标准规范的介绍
- GCC Spec Files
- 【支付】第三方易宝支付
- 电脑qq浏览器怎么滚动截长图_电脑上如何滚动截屏长图?这样做最简单
- 有哪个瞬间让你觉得这个世界出bug了?
- [Joy]冷笑话急转弯
- Discuz! 模板制作
- log(二)——MDC实现之ThreadLocal
- 数据库周刊62丨央企2021年数据库成交公告,国产占90%;流数据库HStreamDB开源;MySQL主从双写导致数据丢失;Oracle 19c升级最佳实践;PG日常工作分享;MySQL MGR运维指
- stm32 串口2空闲中断死机_STM32串口空闲中断问题
- C# 读取CSV文件
- Linux背后的大脑-传奇人物Linus
- wget - Linux系统下载文件工具
- 苹果系统手机调用java线程出错_在多线程Java应用程序中调用已编译的m-file(.jar)时出错...
热门文章
- bbsmax mysql_MySQL中自己不太常用的命令
- 34款管理系统、ERP、CRM、OA等(冠唐\金蝶等)
- 金庸笔下人物名字的来历和意义
- linux异步io底层原理,异步IO简析
- 3GP、MP4视频转换器下载
- html msn 消息,msn在线通玩法介绍 如何创建自己的msn在线通HTML代码
- php视频系统源码,基于ThinkPHP框架仿优酷视频源码带数据,后台功能强大
- 自己用纯Java写的这款Mysql客户端工具美哭了,求收藏~
- 小米wifi驱动 linux驱动,小米wifi驱动程序
- [ssd]linux系统sh后,找不到文件夹的解决