数据结构学习笔记—— 排序算法总结【ヾ(≧▽≦*)o所有的排序算法考点看这一篇你就懂啦!!!】

2023-09-18 15:17:03

一、排序算法总结

常用排序算法如下:

(一)排序算法分类

根据所要排序的元素是否完全在内存中进行排序,可分为以下两种:

名称特点
内部排序(In-place)排序的元素完全在内存中
外部排序(Out-place)在排序过程中不断在内、外存之间交换

其中归并排序基数排序是外部排序,其它均为内部排序。

(二)表格比较

共五大类九种排序算法,插入类可分为直接插入、折半插入和希尔排序,交换类可分为冒泡排序和快速排序,选择类可分为简单选择和堆排序,以及剩下的归并排序与基数排序。
在这里插入图片描述

二、详细分析(最重要考点!!!)

(一)稳定性

  • 插入排序(直接/折半)、冒泡排序、归并排序和基数排序是稳定的排序算法,其中平均时间复杂度为O(nlog2n)的稳定排序只有归并排序
  • 对于插入交换选择三大类的排序算法,较简单型的排序算法一般都是稳定的(除了希尔排序、快速排序、简单选择排序)。
  • 较复杂型的排序算法都是不稳定的,排序中元素的相对位置会发生变化,例如希尔排序、快速排序、堆排序,另外,还有简单选择排序。

(二)时间复杂度

  • 由于直接/折半插入排序、简单选择排序、冒泡排序是较简单型的排序算法,其算法实现过程较简单,时间复杂度均为O(n2),但在最好情况下折半插入排序可以达到O(nlog2n),直接插入排序冒泡排序可以达到O(n),但简单选择排序中元素的比较次数与序列的初始状态无关,所以其时间复杂度始终为O(n2);另外,这四种较简单型的排序算法的空间复杂度均为O(1)。
排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度
直接插入排序O(1)O(n2)O(n)O(n2)
折半插入排序O(1)O(n2)O(nlog2n)O(n2)
冒泡排序O(1)O(n2)O(n)O(n2)
简单选择排序O(1)O(n2)O(n2)O(n2)

  • 希尔排序也称为缩小增量排序,它属于插入类算法,是插入排序的拓展,由于时间复杂度上有较大的改进,所以对较大规模的排序可以达到很高的效率,但无法得出较精确的渐进时间;希尔排序的空间复杂度也为O(1)。
排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度
希尔排序O(1)依赖于增量序列依赖于增量序列依赖于增量序列

  • 快速排序、堆排序和归并排序是改进型的排序算法,其平均时间复杂度均为O(nlog2n),快速排序和归并排序都采用分治的思想,而堆排序是通过使用这种数据结构。
排序算法平均时间复杂度最好时间复杂度最坏时间复杂度
快速排序O(nlog2n)O(nlog2n)O(n2)
堆排序O(nlog2n)O(nlog2n)O(nlog2n)
归并排序O(nlog2n)O(nlog2n)O(nlog2n)
  • 快速排序的初始序列为有序或逆序时,为最坏情况,时间复杂度会达到O(n2),而初始序列越接近无序或基本上无序时,为最好情况,即时间复杂度为O(nlog2n);归并排序中,比较次数与初始序列无关,即分割子序列与初始序列是无关的;堆排序中初始建堆的时间复杂度为O(n),每下坠一层最多只需对比元素两次,每一趟不超过O(h)=O(log2n),所以归并排序和堆排序的最好、最坏时间复杂度都为O(nlog2n) 。

(三)空间复杂度

  • 快速排序中需借助来进行递归,其空间复杂度与递归层数(栈的深度)有关,最坏情况下二叉树为最大高度,为n层,即最大递归深度,空间复杂度为O(n),最好情况下二叉树为最小高度,为⌊ log2n ⌋,即最小递归深度,空间复杂度为O(log2n),堆排序只需借助常数个辅助空间,空间复杂度为O(1) ,归并排序中也用到了,其递归工作栈的空间复杂度为O(log2n),由于另外还需用到辅助数组,其空间复杂度为O(n),所以该排序算法的空间复杂度为O(n)。
排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度
快速排序最好为O(log2n);最坏为O(n);平均情况下,为O(log2n)O(nlog2n)O(nlog2n)O(n2)
堆排序O(1)O(nlog2n)O(nlog2n)O(nlog2n)
归并排序O(n)O(nlog2n)O(nlog2n)O(nlog2n)

(四)比较次数

  • 二路归并排序简单选择排序基数排序的比较次数都与初始序列的状态无关。

(五)平均比较次数

  • 在插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序和基数排序中,平均比较次数最少的排序是快速排序

  • 直接插入排序和简单选择排序对比:通常情况下,直接插入排序每趟插入都需向后一次挪位,而简单选择排序只需找到最小/最大元素与其交换位置即可,它的移动次数较少。

考虑在较极端情况下,对于有序数组,直接插入排序的比较次数为n-1;而简单选择排序的比较次数始终为n(n-1)/2。

(六)排序趟数

  • 直接插入排序、简单选择排序和基数排序的排序趟数与初始序列无关
    (1)直接插入排序由于每趟都插入一个元素至已排好的子序列,所以排序趟数固定为n-1次;
    (2)简单选择排序中,每趟排序都选出一个最小/最大的元素,所以排序趟数也固定为n-1次;
    (3)基数排序需进行d趟分配和收集操作。

(七)根据规模选择排序算法

  • 一般来说,对于要排序元素较多的序列,可以选用时间复杂度为O(nlog2n)的堆排序、快速排序和归并排序算法,其中快速排序是目前基于比较的内部排序中最好的排序算法,但它要求初始序列随机分布这样才会使快速排序的平均时间最短。堆排序的空间复杂度小于快速排序,它不会出现快速排序中的最坏情况。前两种排序算法都是不稳定的,因此若要选择时间复杂度为O(nlog2n)且稳定的排序算法,即可以选择归并排序,通过将该算法与直接插入排序结合起来,即通过直接插入排序求得有序子序列后,再合并,这样的归并算法依旧是稳定的。

  • 若要排序元素很大,记录的元素位数较少时,应选用基数排序,它适用于以下:
1、数据元素的关键字可以很容易地进行拆分成d组,且d较小;
2、每组关键字的取值范围不大,即r较小;
3、数据元素个数n较大。

  • 对于排序元素个数较少的序列,可以选用时间复杂度为O(n2)的直接/折半插入排序、冒泡排序、简单选择排序算法,由于简单选择排序的移动次数比直接插入排序少,所以当元素信息量较大时,应选用简单选择排序。

(八)每趟确定的元素最终位置

每一趟排序算法的进行都能确定一个元素处于其最终位置的排序算法有以下:

①冒泡排序
②简单选择排序
③堆排序
④快速排序

前三者能形成整体有序的子序列,而快速排序只确定枢轴元素的最终位置
(第n趟快速排序完成时,会有n个以上的元素处于其最终结果位置上,
即它们两边的元素分别比它大或小)。

(九)存储方式的选择

  • 插入类只有折半插入希尔排序、交换类只有快速排序、选择类只有堆排序都只适用于顺序存储,而基数排序只适用于链式存储,其他排序算法都可以支持顺序存储和链式存储,例如直接插入、冒泡排序、简单选择排序和归并排序。
    在这里插入图片描述
更多推荐

腾讯视频共享设备ip会不会出现错误

腾讯视频共享设备功能为用户提供了方便的多屏互动体验,然而在使用该功能时,一些用户可能会遇到IP地址错误的问题。IP地址错误可能导致共享设备无法正常连接或通信。本文旨在对腾讯视频共享设备IP错误问题进行分析和解答,帮助读者更好地理解可能引起此类问题的原因,并提供一些解决方法。下面虎观代理小二二将具体介绍一下在使用腾讯视频

【计算机网络】传输层协议——TCP(中)

文章目录1.三次握手三次握手的本质是建立链接,什么是链接?整体过程三次握手过程中报文丢失问题为什么2次握手不可以?为什么要三次握手?2.四次挥手整体过程为什么要等待2MSL3.流量控制4.滑动窗口共识滑动窗口的一般情况理解滑动窗口滑动窗口的特殊情况1.三次握手SYN:是一个连接请求的报文(三次握手),发送的是TCP报头

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及,网络攻击变得越来越普遍和复杂,对企业和个人的网络安全构成了重大威胁。其中,DDoS(分布式拒绝服务)攻击和CC(网络连接)攻击是两种常见且具有破坏性的攻击类型,它们可以对网络基础设施和在线业务造成重大损害。为了抵御这些攻击,IP风险查询变得至关重要。DDoS攻击简介:DDoS攻击旨在通过同时发送大量网

大事件!请注意!AIGC正在疯狂“污染”学术界

原创|文BFT机器人2023年被称为AIGC元年,大模型也成为重中之重,市场预期其创新性甚至远大于移动互联网。AIGC或进一步解放生产力,帮助企业降本增效,影响并改变着互联网的获取信息和内容产出方式。以ChatGPT为代表的新一代人工智能技术迅猛发展,它以强大的语义理解能力、逻辑推理能力和多轮对话能力快速席卷全球,各类

分布式之消息队列精讲

小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,写几个SQL,生成下报表。又或者接到客服的通知,某某功能故障了,改改数据,然后下班部署上线。每天过的都是这种生活,技术零成长。小B,工作于某国企,虽然能接触到一些中间件技术。然而,他只会订阅/发布消

GAN初识

1.生成对抗网络GAN简介1.1生成器G(Z)接受随机噪声Z作为输入生成仿品,并训练自己去欺骗判别器D,让D以为G(Z)产生的任何数据都是真实的。1.2判别器D(Y)可以基于真品和仿品来判断仿造品的仿真程度,通常值越靠近0表示越真实(靠近1表示仿造)。其目标是:使每个真实数据分布中的图像的D(Y)值最大化,并使真实数据

语义噪声的解释

《RobustSemanticCommunicationsAgainstSemanticNoise》定义语义噪声是一种导致误解语义信息和解码错误的噪声。它导致传输的语义符号和接收到的语义符号之间存在差异,在语义编码、数据传输和语义解码阶段都可能被引入[1]分类不同源(文本和图像等)产生语义噪声的原因是不同的:文本文本中

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测|MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测目录时序预测|MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料预测效果基本介绍MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积

Android Studio插件版本与Gradle 版本对应关系

关于作者:CSDN内容合伙人、技术专家,从零开始做日活千万级APP。专注于分享各领域原创系列文章,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。目录一、导读二、概览三、Gradle各版本对应关系3.1Gradle版本3.2插件版本3.3AndroidGradle插件和AndroidStudio兼容

亚马逊云科技创新加速周:以数智化手段加速中国企业出海之旅

近年来,越来越多的中国企业正在走向国际市场,中国企业如何在出海浪潮下稳重求进?9月18日-9月22日,新一期亚马逊云科技合作伙伴加速周将为您带来“智荟出海”专题。“智荟出海计划”是亚马逊云科技发布的一项合作计划,旨在全方位资源赋能合作伙伴,以数智化手段加速中国企业的出海之旅。亚马逊云科技将携手25家合作伙伴,倾情打造为

局部变量,全局变量与内存

本文会使用IDA分析局部变量,全局变量在内存的存储目录使用IDA分析局部变量使用IDA分析全局变量总结使用IDA分析局部变量#include<stdio.h>intmain(){intnNum=1;floatfNum=2.5;charch='A';printf("int%d,float%f,char%c",nNum,f

热文推荐