数据结构:计算机组织存储数据的方式
算法:作用于特定数据集上的算法流程


如何衡量一个排序算法的优劣?
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大排序时间复杂度对比、以及优化相关推荐

  1. 【十大排序算法】(一)冒泡排序算法(优化)

    一.优化第一版 优化第一版是针对类似 int[] arr = {3,2,1,4,5,6,7,8,9; 这样的有很多已经排好序的数组,为了不让它做无用的循环,对于此场景进行的优化,优化代码如下: // ...

  2. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  3. 数据结构各大排序整理+动图演示+代码实现(Java)

    注: 以下部分动图来源于:http://www.west999.com/info/html/chengxusheji/Javajishu/20190217/4612849.html 以下两幅图来自马士 ...

  4. 十大排序算法(C++)(时间复杂度O(nlogn)篇:希尔排序、堆排序、快速排序、归并排序)

    希尔排序 希尔排序本质上是对插入排序的一种优化,它既有插入排序的简单,同时也解决了插入排序每次只交换相邻两个元素的缺点.插入排序过程如下: 1.将数组按照一定的间隔分为多个子数组(每跳跃一定间隔取一个 ...

  5. 排序算法——十大排序算法总结与对比

    一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...

  6. 通过实验对比十大排序算法

    通过实验对比十大排序算法 前面给出了所有算法的实现,代码实现可能还有优化的空间,但也可以通过这些算法来实验大致分析每一种算法的优劣. 文章目录 通过实验对比十大排序算法 实验环境 一.各个排序算法运行 ...

  7. 算法基础-十大排序算法及其优化(文末有抽奖福利哦)

    算法基础-十大排序算法及其优化 算法基础-十大排序算法及其优化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kw1LA5Q4-1607527572080)(/uplo ...

  8. 十大经典排序算法解析及优化

    前言 在上篇文章<十大经典排序算法(动图演示)>中,已经能够了解各种排序算法的思想逻辑,虽然其中提供了代码,但对其解析却并不够全面,而且使用的是js来进行编写演示.本人根据其上代码转换为P ...

  9. 各种排序算法的时间复杂度对比

    各种排序算法的时间复杂度对比 排序算法 最坏时间复杂度 平均时间复杂度 最优时间复杂度 空间复杂度 稳定性 冒泡排序 O(n^2) O(n^2) O(n) O(1) 稳定 插入排序 O(n^2) O( ...

  10. 八大排序算法时间复杂度对比

    八大排序算法时间复杂度对比

最新文章

  1. OpenAI新发现:GPT-3做小学数学题能得55分,验证胜过微调!
  2. 多媒体制作技术心得体会_论多媒体教学的改革与创新
  3. 实战:搭建CA认证中心,使用CA证书搭建HTTPS
  4. dos命令 cd命令使用说明[图文说明]
  5. ssm mysql增删改查_SSM配置并实现简单的数据库增删改查操作
  6. Atitit 通用服务端代理接口 转接口 attilax总结
  7. 黄大刀 :机房建设主要标准规范的介绍
  8. GCC Spec Files
  9. 【支付】第三方易宝支付
  10. 电脑qq浏览器怎么滚动截长图_电脑上如何滚动截屏长图?这样做最简单
  11. 有哪个瞬间让你觉得这个世界出bug了?
  12. [Joy]冷笑话急转弯
  13. Discuz! 模板制作
  14. log(二)——MDC实现之ThreadLocal
  15. 数据库周刊62丨央企2021年数据库成交公告,国产占90%;流数据库HStreamDB开源;MySQL主从双写导致数据丢失;Oracle 19c升级最佳实践;PG日常工作分享;MySQL MGR运维指
  16. stm32 串口2空闲中断死机_STM32串口空闲中断问题
  17. C# 读取CSV文件
  18. Linux背后的大脑-传奇人物Linus
  19. wget - Linux系统下载文件工具
  20. 苹果系统手机调用java线程出错_在多线程Java应用程序中调用已编译的m-file(.jar)时出错...

热门文章

  1. bbsmax mysql_MySQL中自己不太常用的命令
  2. 34款管理系统、ERP、CRM、OA等(冠唐\金蝶等)
  3. 金庸笔下人物名字的来历和意义
  4. linux异步io底层原理,异步IO简析
  5. 3GP、MP4视频转换器下载
  6. html msn 消息,msn在线通玩法介绍 如何创建自己的msn在线通HTML代码
  7. php视频系统源码,基于ThinkPHP框架仿优酷视频源码带数据,后台功能强大
  8. 自己用纯Java写的这款Mysql客户端工具美哭了,求收藏~
  9. 小米wifi驱动 linux驱动,小米wifi驱动程序
  10. [ssd]linux系统sh后,找不到文件夹的解决