(排序11)排序的时间复杂度,空间复杂度,稳定性总结

图片总结

在这里插入图片描述
在这里插入图片描述

内排序时间复杂度总结

  1. 内部排序:数据元素全部放在内存中的排序。
  2. . 在内排序当中比较快的有希尔排序,堆排序,快速排序,归并排序,这四个排序的时间复杂度都是O(n*logn)。其中希尔排序的时间复杂度更加准确的来说是O(n的1.3次方),对于希尔排序来说,它的时间复杂度计算非常之困难,所以直接记结论;对于堆排序来说,他的时间复杂度计算是通过错位相减法而算出来的;对于归并排序来说,它的时间复杂度倒是比快速排序稳定多了,还真就是雷打不动的O(logN)
  3. 然后直接插入排序,选择排序,冒泡排序时间复杂度都是O(N^2)
  4. 在四个比较快的排序当中,快速排序总体来说是最优的,虽然快速排序的时间复杂度受到单趟排序之后key最终落在的位置是否偏向于中间,乃至于快速排序在极端情况之下可以慢到O(N^2),但是好在有抢救方法,比如说三数取中。在最终测试完之后快速排序还是占优。
  5. 在这三个比较慢的排序当中,之前也有提到过,对于直接插入排序而言,不存在最好与最坏情况,都是雷打不动的O(N^ 2)。
  6. 对于冒泡排序而言,它最好的情况是O(N),对于直接插入排序而言,它最好的情况也是O(N)。那么这两个又怎么区分伯仲呢?总体而言是直接插入排序比冒泡排序更好,首先,如果这个待排序的数组是顺序有序的话,那么此时两者匹敌一样;如果说是接近有序的话,对于直接插入排序而言,也只需要在个别插入的过程后进行稍微微调一下;但对于冒泡排序的话,假设在某趟过后,整个数组已经是有序的情况之下,他又需要再去遍历一趟去确定已是有序,因此比直接插入排序要慢一点;两者最大的差距体现在部分有序的情况之下,与直接插入排序而言,当一个新元素需要融入到已经有序的数组当中的时候,在某些情况之下可以直接尾部插入而不用融入过程,可以省掉大量的步骤,对于冒泡排序而言,他对于部分有序并不敏感,因为他每一趟跑一次,只确定下来一个数放到最末尾,尽管你是部分有序,基本上还是接近了O(N^2)

外排序(文件排序)

  1. 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
  2. 对于外部排序而言,唯一的解药就是归并思想,用归并排序,与此同时,不要用递归版本,不然的话你懂的,把子文件数据在无限细分下去不是要分死了吗?因此需要用非递归的归并排序。具体的细节看我之前写的博客文件排序。
  3. 再回顾一下大概的过程:你说我现在在磁盘里面有1000个的数据,假设我内存里面最多能放得下100个数据。那我首先先从磁盘里面读100个数据到内存里面,然后在内存里面用快速排序,先把这100个数据给他排好,把这个读出来的,并且排好了的100个数据再放回新文件当中,然后再从磁盘里面剩下的900个数据当中再去读100个到内存里面来,然后再在内存里面用快速排序给他排好,然后再给他放到一个文件当中,然后现在已经有两个文件里面都是有序的数字,这时候用文件与文件的归并(跟内存已经没有关系了,内存里面是放不下的),然后继续不断向后再去读,再去归并…

排序的空间复杂度总结

  1. 对于直接插入排序,希尔排序,选择排序,冒泡排序,他们都是在原先的数组上进行直接改动,因此他们的空间复杂度都是O(1),不需要额外去创建一个新的辅助空间。
  2. 对于快速排序而言,我们知道由于它是一个递归,递归的话是必须要在原先函数的函数栈帧的低地址的地方再去不断的创建函数栈帧,再去不断的创建函数栈帧。递归有它的一个深度,这也是说为什么当递归层次太深的时候会发生栈溢出。如果是理想化的状态的话,我们知道整个快速排序递归的深度是O(logN),然后不排除极端恶心情况,此时递归的深度能够到O(N),因此他的空间复杂度介于O(logN)-O(N)。注意在每一层快速排序递归而创建的函数栈帧当中,在函数栈帧里面的各种变量啊什么的,他们的空间占用都可以算成O(1),也就是说单单就一个函数栈帧里面,其实也没有啥,主要是他在递归,在不断地向下拓展函数栈帧,这就有空间复杂度的增加了
  3. 对于归并排序而言,他也是在进行递归_MergeSort,它的递归的深度的话是标标准准的logN,但是对于递归而言,在外层非递归函数MergeSort,事先开辟了一个n个空间的额外辅助空间,N肯定是比logN大,因此总的空间复杂度就是O(N)

排序稳定性总结

  1. 在排序当中的稳定性,它并不是指这个性能稳不稳定。
  2. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
  3. 比如说来打个简单的比方,在一个数组当中有两个5,在原先的乱序数组当中,可能两个5是隔开的,但也有一前一后之分。但是当排完序之后这两个5肯定是挨在一起了的,如果说这两个5的相对位置仍然保持不变,那么就叫这个排序是稳定的,否则就是不稳定。稳定性就是指相同数据的相对位置在排序之后是否会发生改变;如果不能保证相对位置不变,那么就是不稳定,否则就是稳定的。
  4. 直接插入排序是稳定的,因为直接插入排序相当于是一个新的数tmp不断的从右边想要融入到已经有序的这么一个数组当中,然后在融入的过程当中,如果说右边的数tmp小于已经有序数组的end所指向的数,那么这时候需要把end所指向的数向后移动一位,然后如果与end指向的数相等的话就直接融入进来,因此两个相等的数也根本就没有任何机会去进行前后交换
  5. 希尔排序是不稳定的,你去想想在一开始的预排序当中,两个相同的数据可能会被分到不同的组,然后进行预排序,然后一开始这个gap又那么大,很容易某个数据就飘到后面去了,控制不住了
  6. 选择排序也是不稳定的,给你举个反例就可以:
    在这里插入图片描述
  7. 堆排序也超级不稳定,给你画个图,举个反例:
    在这里插入图片描述
  8. 冒泡排序肯定是稳定的,冒泡排序就是一趟一趟一趟的去走,然后对于每一趟是两个相邻的数,两个相邻的数这么比下去,如果说我需要升序排列的话,当两个相邻的数当中,左边的数大于右边的数的话,两个数就要发生交换,然后如果说对于数组当中两个具有相同的值的数的话,根本就没有任何机会去进行前后交换,所以说是稳定的
  9. 快速排序也不稳定,给你画个图举个反例:
    在这里插入图片描述
  10. 归并排序是稳定的,当然要把那个等号加上
while(begin1<=end1 && begin2<=end2)
{                //这边这个等号是关键
	if (arr[begin1]<=arr[begin2])
	{
		tmp[k++]=arr[begin1++];
	}
	.........
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

62. 不同路径

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示例 1…

微电网两阶段鲁棒优化经济调度方法(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【网络编程】TCP

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f52e;一. TCP流套接字编程&#x1f4bf;二. TCP中的长短连接&#x1f4c0;三. 写一个 TCP 版本的 回显服务器-客户端 &#x1f52e;一. TCP流套接字编程 ServerSock…

网络视频监控如何入门?如何安装和配置、设备选择和实时监控?

网络视频监控是一种先进的安全技术&#xff0c;它可以通过互联网连接到远程视频服务器&#xff0c;使用户可以随时随地监控所关注的地点。本文将介绍网络视频监控的基础入门知识&#xff0c;包括安装和配置、设备选择和实时监控等方面。 一、安装和配置 在进行网络视频监控前&…

Opencv+Python笔记(四)图像的形态学处理

1.腐蚀与膨胀 膨胀用来处理缺陷问题&#xff0c;把缺陷填补掉&#xff0c;提高亮区面积&#xff1b; 腐蚀用来处理毛刺问题&#xff0c;把毛刺腐蚀掉&#xff0c;降低亮区面积。 腐蚀操作可以消除噪点&#xff0c;同时消除部分边界值&#xff0c;导致目标图像整体缩小。 膨胀…

C#+asp.net基于web的大学社团管理信息系统

本系统的模块是分为用户模块和管理员模块&#xff0c;管理员负责学生管理模块、社团管理模块、公告管理模块、留言管理模块、加入社团管理模块、活动管理模块、管理员管理模块。社团管理员则负责预约管理模块、活动报名的审核等。。 系统具有三类系统用户分别是&#xff1a;系统…

用于测试FDIA在现实约束下可行性的FDIA建模框架(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 信息通信技术的发展和智能设备的引入使电力系统逐渐演变为电力信息物理系统&#xff0c;而信息层与物理层之间的深度耦合也加剧…

【测试面试】吐血整理,大厂测试开发岗面试题(1~4面),拿下年40w...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试面试题&…

【文件系统和系统日志分析】

目录 一、inode和block概述block&#xff08;块&#xff09;inode&#xff08;索引节点&#xff09; 二、inode内容三、inode的号码3.1、查看inode号码的方法 四、inode的大小磁盘分区后的结构访问文件的简单流程 五、删除乱码文件六、inode节点耗尽故障处理6.1、模拟inode节点…

SSM整合的基本思路梳理

SSM整合的简单思路流程 基本思路 我在整合的时候一般习惯从MyBatis开始向上构建&#xff0c;也就是在开始一个项目的时候先将DAO层搭建起来&#xff0c;再向上整合Spring以及SpringMVC。按照这个流程&#xff0c;可以做出一个比较简单的大致流程作为参考&#xff0c;帮助我们…

[MySQL]基本数据类型及表的基本操作

一、常用的数据类型 1.1 数据库表的列类型 数值 1 2 3.14 tinyint 十分小的数据 1个字节smallint 较小的数据 2个字节mediumint 中等大小的数据 3个字节int 标准的整数 4个字节big 较大的数据 8个字节float 浮点数 4个字节double 浮点数 小数 8个字节&#xff08;精度问题&am…

JSON的用法和说明

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。 JSON建构于两种结构&#xff1a; "名称/值"对的集合。理解为对象 值的有序列表。理解为数组 JSON具有以下这些形式&#xff1a; 对象是一个无序的“ ’名称/值‘ 对”集合。一个…

【排序】快速排序(递归和非递归)

快速排序 前言图解大致思路对于hoare版本对于挖坑法对于前后指针法 实现方法递归非递归 快排的优化&#xff08;基于递归的优化&#xff09;三数取中法小区间优化 时间复杂度和空间复杂度 前言 快速排序&#xff0c;听名字就比较霸道&#xff0c;效率根名字一样&#xff0c;非…

永久免费内网穿透不限制速度

市面上的免费内网穿透大都有格式各样的限制&#xff0c;什么限制流量啊&#xff0c;每个月要签到打卡啊&#xff0c;还有更改域名地址等&#xff0c;只有神卓互联内网穿透是永久免费没有限制的&#xff0c;白嫖也可以。 这篇文章分享了3个方案&#xff0c;按照性能和综合指标排…

项目驱动的编写

驱动代码直接使用nfs传输,设备树直接在开发板中修改设备树文件 1、修改好设备树&#xff0c;在内核顶层make dtbs &#xff0c;然后替代tftp目录中的设备树文件 2、使用内核源码编译生成驱动程序&#xff0c;然后传送到开发板中&#xff0c;使用insmod动态加载 LCD驱动 1、初始…

从零学习SDK(7)如何打包SDK

打包SDK的目的是为了方便将SDK提供给其他开发者或用户使用&#xff0c;以及保证SDK的兼容性和安全性。打包SDK可以有以下几个好处&#xff1a; 减少依赖&#xff1a;打包SDK可以将SDK所需的库、资源、文档等打包成一个文件或者一个目录&#xff0c;这样就不需要用户再去安装或…

ArduPilot开源飞控系统之简单介绍

ArduPilot开源飞控系统之简单介绍 1. 源由2. 了解&阅读2.1 ArduPilot历史2.2 关于GPLv32.3 ArduPilot系统组成2.4 ArduPilot代码结构 3. 后续4. 参考资料 ArduPilot是一个可信赖的自动驾驶系统&#xff0c;为人们带来便利。为此&#xff0c;提供了一套全面的工具&#xff0…

读SQL进阶教程笔记12_地址与三值逻辑

1. SQL和数据库都在极力提升数据在表现层的抽象度&#xff0c;以及对用户隐藏物理层的概念 2. 关系模型是为摆脱地址而生的 2.1. “地址”不仅包括指针操作的地址&#xff0c;还包括数组下标等 3. 一个优雅的数据结构胜过一百行杂耍般的代码 3.1. 精巧的数据结构搭配笨拙的…

Spring MVC 的调用(12)

目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器&#xff08;DispatcherServlet&#xff09; 第二步&#xff1a;前端控制器请求处理器映射器&#xff08;HandlerMappering&#xff09;去查找处理器&#xff08;Handle&#xff09;&#xff1a;通过xml配置或者…

高效部署Redis Sentinel模式(哨兵模式),手把手教学

Redis Sentinel模式部署 前言一、服务器部署同版本的redis1、换软件源在yum拉取包的时候启用remi源 二、修改配置文件1.修改/etc/redis.conf2.配置/etc/redis/sentinel.conf 三、启动redis服务1、启动服务2、连接redis3、检查redis 前言 这里就不过多的解释高可用的好处了&…