【数据结构】十大经典排序算法总结与分析

ops/2024/9/20 3:41:12/ 标签: 数据结构, 排序算法, 算法, 开发语言, c语言

在这里插入图片描述

文章目录

  • 前言
  • 1. 十大经典算法>排序算法分类
  • 2. 相关概念
  • 3. 十大经典算法总结
  • 4. 补充内容
    • 4.1 比较排序和非比较排序的区别
    • 4.2 稳定的算法就真的稳定了吗?
    • 4.3 稳定的意义
    • 4.4 时间复杂度的补充
    • 4.5 空间复杂度补充
  • 结语

前言

算法>排序算法是《数据结构算法》中最基本的算法之一。

算法>排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

在这里插入图片描述

前面通过11篇内容的学习,我们已经深刻的了解了十大经典算法>排序算法,本文将对这十大经典算法进行总结,比较与分析。

1. 十大经典算法>排序算法分类

十种常见算法>排序算法可以分为两大类

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O ( n l o g n ) O(nlogn) O(nlogn),因此称为非线性时间比较类排序。

线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

在这里插入图片描述

2. 相关概念

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
  • 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
  • 内排序:所有排序操作都在内存中完成;
  • 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
  • **时间复杂度:**时间复杂度就是时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。
  • 空间复杂度:空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度

3. 十大经典算法总结

在这里插入图片描述

在这里插入图片描述

名词解释

  • n: 数据规模
  • k: “桶”的个数
  • In-place: 占用常数内存,不占用额外内存
  • Out-place: 占用额外内存

4. 补充内容

4.1 比较排序和非比较排序的区别

  • 常见的快速排序、归并排序、堆排序、冒泡排序等属于比较排序在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。
    冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为 O ( n 2 ) O(n^2) O(n2)。在归并排序、快速排序之类的排序中,问题规模通过分治法消减为 l o g n logn logn,所以时间复杂度平均 O ( n l o g n ) O(nlogn) O(nlogn)

    比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。

  • 计数排序、基数排序、桶排序则属于非比较排序。非比较排序是通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr[i]之前有多少个元素,则唯一确定了arr[i]在排序后数组中的位置。
    非比较排序只要确定每个元素之前的已有的元素个数即可,所有一次遍历即可解决。算法时间复杂度 O ( n ) O(n) O(n)

    非比较排序时间复杂度底,但由于非比较排序需要占用空间来确定唯一位置。所以对数据规模和数据分布有一定的要求。

4.2 稳定的算法就真的稳定了吗?

算法思想的本身是独立于编程语言的,所以你写代码去实现算法的时候很多细节可以做不同的处理。采用不稳定算法不管你具体实现时怎么写代码,最终相同元素位置总是不确定的(可能没变也可能变了)。

而稳定算法>排序算法是你在具体实现时如果细节方面处理的好就会是稳定的,但有些细节没处理得到的结果仍然是不稳定的。

4.3 稳定的意义

如果我们只是面对简单的数字排序,那么稳定性确实也没有多大意义。比如1 2 3 3 4的序列中如果第一个3和第二个3在sort方法反复执行之后位置也反复变化,但是对于调用sort方法所想要获得排序结果的上游应用而言,那么结果还是1 2 3 3 4,至于3的次序,无关紧要。

如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)

如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。

那么算法>排序算法的「稳定性」在什么情况下才会变得有意义呢?

举个例子,一个班的学生已经按照学号大小排好序了,我现在要求按照年龄从小到大再排个序,如果年龄相同的,必须按照学号从小到大的顺序排列。那么问题来了,你选择的年龄排序方法如果是不稳定的,是不是排序完了后年龄相同的一组学生学号就乱了,你就得把这组年龄相同的学生再按照学号排一遍。如果是稳定的算法>排序算法,我就只需要按照年龄排一遍就好了。

(从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法。)

算法>排序算法的「稳定性」有何意义?这个还是要分应用场景来看,很多使用情况下,并没有什么实质的意义,而在有些情况下却有很重要的意义。

有很多算法你现在看着没啥,但是当放在大数据云计算的条件下它的稳定性非常重要。举个例子来说,对淘宝网的商品进行排序,按照销量,价格等条件进行排序,它的数据服务器中的数据非常多,因此,当时用一个稳定性效果不好的算法>排序算法,如堆排序、shell排序,当遇到最坏情形,会使得排序的效果非常差,严重影响服务器的性能,影响到用户的体验。

4.4 时间复杂度的补充

一般讨论的时间复杂度均是最坏情况下的时间复杂度。这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长
平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。设每种情况的出现的概率为 p i pi pi,平均时间复杂度则为 s u m ( p i ∗ f ( n ) ) sum(pi*f(n)) sum(pif(n))

4.5 空间复杂度补充

利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。程序执行时所需存储空间包括以下两部分:
(1)固定部分:这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间:这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。

空间复杂度所考虑的是可变空间这一部分

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

带你初步了解算法>排序算法:https://blog.csdn.net/2301_80191662/article/details/142211265
直接插入排序:https://blog.csdn.net/2301_80191662/article/details/142300973
希尔排序:https://blog.csdn.net/2301_80191662/article/details/142302553
直接选择排序:https://blog.csdn.net/2301_80191662/article/details/142312028
堆排序:https://blog.csdn.net/2301_80191662/article/details/142312338
冒泡排序:https://blog.csdn.net/2301_80191662/article/details/142324131
快速排序:https://blog.csdn.net/2301_80191662/article/details/142324307
归并排序:https://blog.csdn.net/2301_80191662/article/details/142350640
计数排序:https://blog.csdn.net/2301_80191662/article/details/142350741
十大经典算法>排序算法总结与分析:https://blog.csdn.net/2301_80191662/article/details/142211564

在这里插入图片描述
参考内容:如果我问你:算法>排序算法的「稳定性」有何意义?你怎么回答? (qq.com)

十大经典算法>排序算法的复杂度分析_算法>排序算法时间复杂度-CSDN博客


http://www.ppmy.cn/ops/113234.html

相关文章

QtConcorrent学习、以及与QThread之间的联系

目录 一、QtConcorrent 概述 1、功能 2、特点 3、使用场景 4、QtConcurrent::run 5、应用示例 5、挑战和解决方案 6、QtConcurrent的重要性和价值 二、QFuture 1、主要特点和功能 2、应用示例 三、QtConcorrent与QThread 1、抽象级别和易用性 2. 线程管理和资源利…

C++速通LeetCode简单第6题-环形链表

快慢指针真的很好用! /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:bool hasCycle(ListNode *head) {//快慢指针ListNode* fast…

2024.9.19

[ABC266F] Well-defined Path Queries on a Namori 题面翻译 题目描述 给定一张有 N N N 个点、 N N N 条边的简单连通无向图和 Q Q Q 次询问,对于每次询问,给定 x i , y i x_i,y_i xi​,yi​,表示两点的编号,请你回答第 x i …

微信小程序开发第三课

1 wxml语法 1.1 模版语法 # 1 在页面 xx.js 的 Page() 方法的 data 对象中进行声明定义 # 2 在xx.wxml 中使用 {{}} 包裹,显示数据 # 3 可以显示如下,不能编写js语句或js方法-变量-算数运算-三元运算-逻辑判断# 4 只是单纯通过赋值,js中…

跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例

在数字化时代,地理信息系统(GIS)技术正以其独特的空间分析和可视化能力,为游戏产业带来革命性的变革。《黑神话:悟空》作为中国首款3A级别的动作角色扮演游戏,不仅在游戏设计和技术上取得了突破&#xff0c…

【华为杯】第二十一届中国研究生数学建模竞赛

“华为杯”第二十一届中国研究生数学建模竞赛即将开始,梦想科研社给大家整理一些比赛信息,在正式开赛后,我们也会持续分享一些课题的分析以及代码,有需要的可以联系我们获取资料信息哦 一、时间节点 1.加密赛题开始下载时间&…

大数据新视界 --大数据大厂之SaaS模式下的大数据应用:创新与变革

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

计算机三级网络技术总结(二)

RPR使用统计复用的方法传输IP分组IEEE802.16a用于固定结点接入ADSL技术为速率非对称型,上行速率为64kbps~640kbpsRAID是磁盘阵列技术在一定程度上可以提高磁盘存储容量但不能提高容错能力中继器工作在物理层VTP有三种工作模式:VTP Server、VTP Client 和VTP Transpa…

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一:属性注入 场景二:set注入 场景三:构造方法注入 场景四:形参注入 场景五:只有一个构造函数,无注解 场景六:Autowired和Quali…

通信工程学习:什么是HSS归属用户服务器

HSS:归属用户服务器 HSS(归属用户服务器,Home Subscriber Server)是IP多媒体子系统(IMS)中控制层的一个重要组成部分,它扮演着存储和管理用户相关信息的核心角色。以下是关于HSS归属用户服务器的…

计算机毕业设计选题推荐-校园车辆管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定)

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

while循环及简单案例

//循环是流程控制中的一个重要分支 //流程控制 条件判断 循环 逻辑处理 //循环的目的和意义 //循环的目的是为了执行一块代码 //循环的意义是为了简化代码。增加代码的复用性 /* //例如输出0-100的数…

Pytorch是如何做显存管理的

参考资料: GPT的回答 自己的实验结果 之前自己在用Pytorch跑模型训练的时候产生了如下一系列问题:1)Pytorch使用的cuda显存什么时候释放 2)什么时候会导致显存堆积 3)如何监控显存的使用。经过查找资料后找到了这些问题的答案,现在记录在此&a…

Node.js快速入门

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战(Web前端技术丛书)》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) Node.js运行环境搭建-CSDN博客 本节将介绍如何快速入门Node.js。 1.3.1 Node.…

C++——给出一个不多于5位的正整数,要求:(1)求出它是几位数 (2)分别打印出每一位数字 (3)按逆序打印出各位数字,例如原数为321,应输出123。

没注释的源代码 #include <iostream> using namespace std; int main() { int x,a,b,c,d,e,f,len; cout<<"请输入一个不多于5位的正整数:"; cin>>x; if (x>999999) cout<<"输入错误&#xff01;"<<en…

linux服务器配置及服务器资源命令使用查看

在做性能压测之前&#xff0c;需要对被测服务器有所了解&#xff0c;常用的服务器资源有&#xff1a;CPU、内存、硬盘、网络、进程等 sysstat百度网盘&#xff1a;sysstat 提取码: 0000 一、查看系统服务器配置信息 常用命令&#xff1a;cat /proc/cpuinfo或者lscpu、pidsta…

根据NVeloDocx Word模板引擎生成Word(五)

前面几篇基本上介绍完了NVeloDocx的基础用法&#xff0c;绝大部分的需求其实都是这些基础的东西&#xff0c;本篇将介绍2个不常用但是实际的业务场景&#xff1a; 1、图片列表输出&#xff1b; 比如在E6开发平台生成的客户端中&#xff0c;图片列表往往是这样显示的&#xff…

循环神经网络

文章目录 序列模型文本预处理语言模型和数据集循环神经网络从0实现简洁实现 GRU从0开始实现简洁实现一个例子 LSTM从0实现简洁实现 深度循环神经网络双向循环神经网络机器翻译与数据集编码器-解码器序列到序列的学习 !nvidia-smiWed Sep 11 07:23:53 2024 -------------…

Python实现一个简单的爬虫程序(爬取图片)

目录 1、安装爬虫Scrapy 2、新建爬虫项目 3、配置爬虫 4、编写爬虫代码,爬取百度图片 5、运行爬虫程序 使用爬虫需要遵守相关法律和规范! 1、安装爬虫Scrapy 编程环境是Anaconda,其安装和使用见我之前的文章,这里就不赘述了。 首先安装爬虫Scrapy,为了加快下载速度…

Nacos和Eureka的区别

前言 Nacos 和 Eureka 都是用于服务发现与注册的工具&#xff0c;它们在微服务架构中都扮演着重要角色。 Nacos与Eureka的共同点 都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测 Nacos与Eureka的区别 Nacos支持服务端主动检测提供者状态&#xff1a;临时实例采…