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

news2024/10/7 12:25:52

图片总结

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

内排序时间复杂度总结

  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++];
	}
	.........
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RB-PEG-COOH,罗丹明聚乙二醇羧基;RhodamineB-PEG-acid;RB-PEG2000-COOH

RB-PG-COOH, 罗丹明聚乙二醇羧基 中文名称&#xff1a;罗丹明-聚乙二醇-羧基 英文名称&#xff1a;RhodamineB-PEG-acid RB-PEG-COOH 性状&#xff1a;固体或粘性液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DCM、DMF、DMSO等常规性有机溶剂 分子量&#xff1…

MySQL运维28-MySQL复制

文章目录 1、MySQL复制模式2、MySQL复制的兼容性3、与MySQL复制相关的两种日志3.1、中继日志3.2、MySQL复制的状态日志 4、MySQL主从复制的实施示例4.1、主从库安装4.2、主库配置4.3、从库的配置4.4、启动复制和确认成功 5、对MySQL复制的监控6、MySQL监控的运维6.1、在从库修改…

ASEMI代理ADAU1979WBCPZ原装ADI车规级ADAU1979WBCPZ

编辑&#xff1a;ll ASEMI代理ADAU1979WBCPZ原装ADI车规级ADAU1979WBCPZ 型号&#xff1a;ADAU1979WBCPZ 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;LFCSP-40 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;40 类型&#xff1a;车规级…

Linux串口应用编程

在Linux系统中&#xff0c;操作设备的统一接口就是&#xff1a;open/ioctl/read/write。 对于UART&#xff0c;又在ioctl之上封装了很多函数&#xff0c;主要是用来设置行规程。 所以对于UART&#xff0c;编程的套路就是&#xff1a; 使用open函数打开串口设置行规程&#xff…

vue---自定义指令

目录 1、为什么使用自定义指令&#xff1f; 2、自定义指令 3、自定义指令使用 1、为什么使用自定义指令&#xff1f; 什么时候我们需要去自定义一个指令呢&#xff1f; 事件修饰符&#xff0c;很大的程度上我们是为了让我们的代码更加显得是数据驱动的以及可测试的&#x…

姿态识别、手势识别(附代码)

姿态识别技术是一种基于计算机视觉的人体姿态分析方法&#xff0c;可以通过分析人体的姿态&#xff0c;提取出人体的关键点和骨架信息&#xff0c;并对人体的姿态进行建模和识别。随着深度学习技术的发展&#xff0c;近年来姿态识别技术得到了广泛的应用和研究&#xff0c;其中…

React框架的介绍、特点、安装及基本使用流程

一、react介绍 官网&#xff1a;React (docschina.org) react是由facebook前端开发团队开发和维护的js框架 react的实现功能类似VUE&#xff0c;但是由于国外的开发风格&#xff0c;导致在react上&#xff0c;并没有对数据渲染的步骤进行封装&#xff0c;需要开发者更多的使…

【计算几何】点在几何图形中定位问题

一、说明 点的定位属于几何查找&#xff0c;是计算几何中的一个重要的问题。其包括点在三角形内外&#xff0c;多边形内外判断&#xff0c;平面剖分中的位置等。 二、点和几何区域的关系 2.1 点和线的位置关系 两个平行向量的叉乘等于0。如果两个向量的叉乘等于0&#xff0c…

Kali下开启远程管理-ssh

1、使用管理员root修改/etc/ssh/sshd_config 配置文件 ┌──(kali㉿kali)-[~] └─# sudo -i //切换管理root ┌──(root㉿kali)-[~] └─# vim /etc/ssh/sshd_config PermitRootLogin prohibit-password > yes PasswordAuthentication 去掉#号 2、重启ssh.serv…

大数据项目之数仓相关知识

第1章 数据仓库概念 数据仓库&#xff08;DW&#xff09;: 为企业指定决策&#xff0c;提供数据支持的&#xff0c;帮助企业&#xff0c;改进业务流程&#xff0c;提高产品质量等。 DW的输入数据通常包括&#xff1a;业务数据&#xff0c;用户行为数据和爬虫数据等 ODS: 数据…

基于计算机视觉手势识别控制系统YoLoGesture (利用YOLO实现) 有详细代码+部署+在线服务器尝试+开源可复现

基于计算机视觉手势识别控制系统YoLoGesture (利用YOLO实现) 在线服务器体验网址&#xff1a; https://kedreamix-yologesture.streamlit.app/ 文章目录 基于计算机视觉手势识别控制系统YoLoGesture (利用YOLO实现)1. 项目已完成的部分2. 部分尝试结果3. 项目整体框架3.1. 数据…

如何实现多个窗口同步操作?技术层面?借助工具?

朋友们&#xff01;你们是否曾经遇到过需要在多个窗口之间进行同步操作的情况&#xff1f;例如&#xff0c;你想在不同的浏览器窗口中同时滚动或者放大缩小网页。如果你有这样的需求&#xff0c;东哥今天就从技术和借助专业工具两方面给大家讲解如何实现对多个相同布局的窗口进…

【C++入门必备知识:|引用| +|auto关键字| + |范围for|】

【C入门必备知识&#xff1a;|引用| |auto关键字| |范围for|】 ①.引用Ⅰ.引用概念Ⅱ.引用使用Ⅲ.引用特性Ⅳ.使用场景1.做函数参数意义&#xff1a; 2.做函数返回值意义&#xff1a; Ⅵ.常引用Ⅶ.引用与指针区别 ②.auto关键字1.使用规则 ③.基于范围的for循环1.使用规则 在这…

如何在你的云服务器/云主机上更新并使用最新版本的python(python3.11)

更新并使用最新版本的python3.11 第一步&#xff0c;登录云服务器&#xff0c;并更新系统包 打开您的终端&#xff08;Terminal&#xff09;或使用任意SSH客户端&#xff0c;输入如下命令来登录云主机&#xff1a; ssh 用户名IP地址 在输入密码后&#xff0c;您将成功登录到云…

【软考备战·希赛网每日一练】2023年4月21日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题 三、知识查缺 题目及解析来源&#xff1a;2023年04月21日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 第二题 解析&#xff1a; 活动图 是一种特殊的状态图&#xff0c;它展现了在系统…

【谷歌扩展程序入门】简单制作一个查看网页结构的扩展程序

简言 在想看网页结构的时候一般会F12查看元素内容。 太麻烦了 还不简单方便。 扩展程序 扩展建立在诸如 HTML、JavaScript 和 CSS 之类的 Web 技术之上。它们在单独的沙盒执行环境中运行并与 Chrome 浏览器交互。 扩展允许您通过使用 API 修改浏览器行为和访问 Web 内容来“扩…

wsl2-ubuntu20编译Lineage17(Android10)

WSL2安装Ubuntu20 wsl2安装 略 安装Ubuntu20 wsl.exe --list --online 列出当前支持的所有系统&#xff0c;不过这个命令是从https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json来获取&#xff0c;所以有很大概率会失败。失败就…

解忧杂货铺(三):工作相关资源搜集

1、概述 此文档记录一些对自己很有用的小工具或者其他资源的链接 2、资源 2.1 Hightec生成HEX的方法 Hightec生成HEX的方式https://blog.csdn.net/qq_31225611/article/details/113696362 2.2 UML各个图解析 UML图https://blog.csdn.net/qq_35423190/article/details/1250…

ChatGPT: 深入解读OpenAI的语言模型技术

ChatGPT: 深入解读OpenAI的语言模型技术 引言 引言部分旨在介绍ChatGPT是什么&#xff0c;为什么它是近年来最受欢迎的语言模型之一&#xff0c;并概述本文的主要内容。 1.1 简介 ChatGPT是由OpenAI开发的一种基于深度学习技术的对话生成模型。它采用了最先进的自然语言处理技…

python之流程控制练习题(二)

1、计算1~100的和&#xff08;包含1和100&#xff09;2、计算1~6的乘积&#xff08;包含1和6&#xff09;3、计算1~100之间偶数的和&#xff08;包含1和100&#xff09;4、计算1~100之间可以被3又能被5整数的数的个数&#xff08;包含1和100&#xff09;5、使用循环&#xff0c…