CSP-J 算法基础 排序算法的基本概念

news2024/9/24 21:27:28

文章目录

  • 前言
  • 排序算法的稳定性
    • 稳定排序算法的例子
    • 不稳定排序算法的例子
    • 总结
  • 有序度和逆序度
    • 有序度(Sortedness)
    • 逆序度(Inversion Count)
        • 计算逆序度的例子
    • 总结
  • 满有序度
    • 计算公式
    • 解释
    • 举个例子
    • 总结
  • 总结


前言

排序算法是计算机科学中最基础的算法之一,广泛应用于数据处理、搜索、优化等各种场景。排序的目的是将一组数据按一定的顺序(通常是升序或降序)排列,以便后续的高效处理。常见的排序算法有很多种,每种算法都有其特点和适用场景。本文将介绍排序算法的基本概念,并总结这些算法的优缺点和应用场景。


排序算法的稳定性

排序算法的稳定性是指当我们用排序算法对一组元素进行排序时,如果两个元素的值相同,它们在排序后的结果中保持原来的相对顺序,那么这个排序算法就是稳定的。如果排序后这两个元素的相对顺序可能改变了,那么排序算法就是不稳定的。

想象你在图书馆里整理书籍。你有一堆书,每本书都有一个作者和一个出版年份。如果你按出版年份排序这些书,但书的作者顺序保持不变(比如,《书A》和《书B》都是2010年出版的,且《书A》在《书B》前面),那么这个排序过程就是稳定的。

稳定排序算法的例子

  1. 冒泡排序(Bubble Sort)

    • 冒泡排序会逐一比较相邻的元素,并交换它们的位置,使较大的元素逐渐“冒泡”到列表的末尾。它保证了相同值的元素在排序后保持原来的相对顺序。
  2. 插入排序(Insertion Sort)

    • 插入排序将每个元素逐一插入到已经排好序的部分中。相同值的元素在插入时保持了它们原有的相对位置,因此插入排序也是稳定的。
  3. 归并排序(Merge Sort)

    • 归并排序通过将数组分成小块,分别排序,再将小块合并。合并时,它会保持相同值元素的相对顺序,从而保证了稳定性。

不稳定排序算法的例子

  1. 选择排序(Selection Sort)

    • 选择排序每次从未排序部分中选择最小(或最大)的元素,并将其放到已排序部分的末尾。这个过程中,如果遇到相同值的元素,可能会打破它们的相对顺序,因此选择排序是不稳定的。
  2. 快速排序(Quick Sort)

    • 快速排序使用分治策略,通过选择一个基准元素,将数组分成两部分。相同值的元素在分组过程中可能会重新排列,因此快速排序通常是不稳定的。
  3. 堆排序(Heap Sort)

    • 堆排序通过构建堆数据结构来排序。因为堆的构造过程可能会打破相同值元素的原始相对顺序,所以堆排序通常是不稳定的。

总结

排序算法的稳定性就是看相同值的元素在排序后是否保持原来的顺序。稳定排序算法确保了相同值元素的相对位置不会改变,而不稳定排序算法则可能会改变它们的相对顺序。理解这一点可以帮助你选择合适的排序算法来满足特定的需求。

有序度和逆序度

有序度逆序度是用来描述一个序列中元素排列情况的两个概念。它们帮助我们理解数据的“有序程度”,即数据的顺序情况。

有序度(Sortedness)

有序度指的是一个序列中元素的有序程度。简单来说,就是有多少对元素是按照正确的顺序排列的。这里有几种常见的情况:

  1. 完全有序

    • 所有元素都按照升序或降序排列。例如,[1, 2, 3, 4, 5] 是完全有序的升序序列,[5, 4, 3, 2, 1] 是完全有序的降序序列。
  2. 部分有序

    • 序列中的某些部分是有序的,但整体上可能不是。例如,[1, 3, 2, 4] 是部分有序的,因为前两元素是升序的,后两元素也是升序的,但整体上不是完全有序的。
  3. 无序

    • 序列中没有明显的顺序。例如,[4, 1, 3, 2] 是无序的。

逆序度(Inversion Count)

逆序度是用来衡量一个序列中有多少对元素的顺序是相反的。换句话说,就是多少对元素在原始序列中的位置不符合升序排列的规则。

  • 逆序对
    • 如果序列中第 i 个元素大于第 j 个元素(i < j),那么 (arr[i], arr[j]) 就是一个逆序对。
计算逆序度的例子

假设我们有一个序列 [3, 1, 2]

  • 比较 313 > 1,所以 (3, 1) 是一个逆序对。
  • 比较 323 > 2,所以 (3, 2) 是另一个逆序对。
  • 比较 121 < 2,所以 (1, 2) 不是逆序对。

在这个例子中,总共有两个逆序对:(3, 1)(3, 2)。因此,逆序度是 2。

总结

  • 有序度:描述序列中元素有序的程度。可以是完全有序、部分有序或无序。
  • 逆序度:计算序列中有多少对元素的顺序是相反的。用来衡量序列的无序程度。

理解这两个概念可以帮助你更好地分析和处理数据中的排序问题。

满有序度

满有序度(Sortedness Degree)是用来描述一个序列的有序程度的度量,它是用来表示一个序列在多大程度上接近完全有序的情况。简单来说,满有序度告诉我们,当前的序列距离完全有序的状态有多远。

想象你有一堆牌,你的目标是把这些牌按从小到大的顺序排好。如果你已经有一些牌排得很整齐,那么满有序度就可以告诉你这些整齐的牌占总牌的比例。

计算公式

满有序度的计算通常基于序列中的逆序对,它可以用以下公式来表示:

在这里插入图片描述

或者简单说,就是:

在这里插入图片描述

解释

  • 当前逆序对数:序列中实际存在的逆序对的数量。即每对在原始序列中位置不符合升序排列的元素对。
  • 最大逆序对数:在最大程度的无序状态下,序列中的逆序对总数。对于一个长度为 n 的序列,最大逆序对数是 在这里插入图片描述

举个例子

假设你有一个序列 [3, 1, 2]

  1. 计算当前逆序对数

    • (3, 1) 是一个逆序对。
    • (3, 2) 是另一个逆序对。
    • 总逆序对数是 2。
  2. 计算最大逆序对数

    • 序列长度是 3。
    • 最大逆序对数是在这里插入图片描述
  3. 计算满有序度

    • 满有序度 = 在这里插入图片描述

这意味着在这个例子中,序列的满有序度约为 0.33,表明它还距离完全有序的状态有一定的距离。

总结

满有序度是一个量化序列有序程度的度量,它通过计算逆序对的数量来反映序列的有序程度。它告诉我们序列离完全有序的状态有多远,从而可以帮助我们理解和优化排序过程。


总结

排序算法在不同的应用场景中扮演着重要角色,不同的算法在执行效率、空间复杂度、稳定性等方面各有千秋。比如,快速排序在平均情况下非常高效,适用于大量数据,但它是不稳定的;归并排序虽然在时间复杂度上表现优异且稳定,但需要额外的空间。理解各种排序算法的特性,可以帮助我们根据实际需求选择合适的算法,从而在程序设计中达到更高效、更合理的效果。

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

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

相关文章

代币化资产如何拯救 DeFi:让金融重回价值创造的正轨

在过去几年中&#xff0c;去中心化金融&#xff08;DeFi&#xff09;已成为加密领域的热门话题&#xff0c;吸引了大量投资者和开发者。然而&#xff0c;随着行业的发展&#xff0c;DeFi市场逐渐暴露出一些根本性问题&#xff0c;使得其增长潜力受到限制。以太坊联合创始人Vita…

携手浙商证券、华锐技术,共话交易技术的创新与应用

秉承“虚已者进德之基&#xff0c;求同存异谓之共赢”的理念&#xff0c;浙商证券联合非凸科技、华锐技术于8月28日在深圳举办了“量化机遇汇浙&#xff0c;交易技术共商”鑫管家私募沙龙纷享会。此次活动汇聚了众多优秀管理人与资方代表&#xff0c;分享前沿观点&#xff0c;探…

C++——初始化成员列表

在C中&#xff0c;初始化成员列表&#xff08;Initializer List&#xff09;是一种特殊的构造函数语法&#xff0c;用于在对象创建时直接初始化其成员。初始化成员列表通常用于以下几种情况&#xff1a; 1、初始化基类构造函数 一个类从其他类派生而来&#xff0c;它的构造函…

「超强力频闪发光」的超亮频闪光源LDR-PF系列

光源在机器视觉系统中起着重要作用&#xff0c;不同环境、场景及应用合适光源都不一样&#xff0c;今天我们来看看CCS光源的「超强力频闪发光」的超亮频闪光源PF系列。PF系列根据其形状分为环形&#xff0c;条形&#xff0c;同轴等。 以LDR-PF环形为例&#xff0c;它有如下特点…

【LabVIEW学习篇 - 19】:人机界面交互设计03

文章目录 运行菜单主菜单右键快捷菜单 运行菜单 菜单是人机交互非常重要的一个途径&#xff0c;它的好处是把需要的操作隐藏起来&#xff0c;当用户需要的时候才激活&#xff0c;因此相对于把所有的操作以按钮的形式放在界面上&#xff0c;可以节省很大的空间。 菜单有两种&a…

ubuntu 20.04 编译dcmtk

1 安装cmake 检查是否安装cmake。打开终端&#xff0c;运行如下命令&#xff1a; Cmake --version 如已安装&#xff0c;则显示正常显示cmake版本号。如显示错误&#xff0c;则需要安装cmake。 sudo apt-get install cmake-qt-gui 2 下载dcmtk源码 下载地址&#xff1a;&…

关于支付宝小程序客户端退出不了的问题的认知和退出的解决方案

结论&#xff1a; 支付宝小程序登录后会员退出&#xff0c;不仅要将客户端登录凭证清空&#xff0c;还要同步将服务端登录凭证清空。 猜测原因&#xff1a; 支付宝小程序会和webview差不多&#xff0c;用到cookie. 问题场景重现&#xff1a; 如图&#xff0c;登录后&#x…

如何将网络安全防范游戏化

组织对威胁的准备和恢复能力跟不上网络犯罪分子的进步。 一些首席执行官仍然认为网络安全需要偶尔干预&#xff0c;而不是持续关注。 但对于许多公司来说&#xff0c;情况并非如此&#xff1b;网络威胁准备需要协调一致的培训工作&#xff0c;因此网络安全团队在攻击发生时已…

CMDB是什么软件?对企业有什么用?

配置管理数据库缩写为CMDB&#xff0c;英文全称为Configuration Management Database&#xff0c;是一种用于记录和管理企业信息技术基础设施&#xff08;IT基础设施&#xff09;和所有相关资源的数据库软件。 CMDB的主要功能是收集、存储和分析所有IT基础设施和服务的信息&am…

《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》要点提炼

论文来源&#xff1a;https://arxiv.org/abs/2402.18115 《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》是2024CVPR中的一篇关于视频分割的论文&#xff0c; 主要内容&#xff1a; 论文提出了一个名为UniVS的新型统一视频分割架构&#xff0c…

使用Inno Setup制作程序安装包

Inno Setup软件安装见&#xff1a; Inno Setup下载、安装和增加简体中文安装语言 一、制作程序安装包 先准备要被打包的可执行文件及其环境文件&#xff1b;另外还需要三个txt文件 三个文件中的内容如下&#xff0c;在使用程序安装包时会看到文件中的内容&#xff0c;同时文…

啊,原来她就是李飞飞

今天CSDN的头条看到了著名的AI大模型专家李飞飞。 李飞飞教授在人工智能领域&#xff0c;尤其是在大模型的发展中&#xff0c;做出了诸多贡献。以下是对她的一些公开经历和研究成果的详细介绍&#xff1a; 公开经历 教育背景&#xff1a;李飞飞获得了普林斯顿大学的物理学士…

【原创教程】自动化工程案例01:8工位插针装配机03-程序解读

在前面两篇文章中&#xff0c;我们介绍了8工位设备每个工位的情况&#xff0c;然后我们介绍了触摸屏的情况&#xff0c;接着我们来看一下程序。关于一些实物照片不宜公开发表&#xff0c;需要的可以私信。 程序系统块设置 系统块中的模块实际上是我们所使用的的硬件设施 符号…

第T7周:咖啡豆识别

本文为&#x1f517;365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 ●难度&#xff1a;夯实基础 ●语言&#xff1a;Python3、TensorFlow2 要求&#xff1a; 1.自己搭建VGG-16网络框架 2.调用官方的VGG-16网络框架 拔高&#xff08;可选&#xff09;&#…

初识爬虫1

学习路线&#xff1a;爬虫基础知识-requests模块-数据提取-selenium-反爬与反反爬-MongoDB数据库-scrapy-appium。 对应视频链接(百度网盘)&#xff1a;正在整理中 爬虫基础知识&#xff1a; 1.爬虫的概念 总结&#xff1a;模拟浏览器&#xff0c;发送请求&#xff0c;获取…

新版idea菜单栏展开与合并

新版idea把菜单栏合并了看着很是不习惯&#xff0c;找了半天原来在这里展开 ① 点击文件 -> 设置 ② 点击外观与行为 -> 外观 -> 合并主菜单和窗口标题 然后确定&#xff0c;重启即可

如何应对 Android 面试官 -> 启动如何进行优化(上)?玩转 Android StartUp

前言 本章主要围绕 App 的启动流程如何优化进行讲解&#xff1b; 将启动优化&#xff0c;首先要了解的就是 app 的启动流程&#xff0c;只有清晰并完善的了解了 启动流程 才能更好的进行优化&#xff1b; App 启动流程 在将 AMS 的时候&#xff0c;其实已经讲解了 App 的启动…

喜报! 炼石入选中国信通院《数据安全产业技术产品服务全景图》

近日&#xff0c;在2024中国国际大数据产业博览会“数据安全产业发展”交流活动上&#xff0c;中国信息通信研究院安全研究所副所长魏薇发布了《数据安全产业技术产品服务全景图》&#xff08;以下简称“全景图”&#xff09;。全景图从数据安全产业的概念和内涵出发&#xff0…

强大的3款自动爬虫利器,再也不用手撸代码了

爬虫是一种自动浏览互联网的程序&#xff0c;它按照一定的算法顺序访问网页&#xff0c;并从中提取有用信息。爬虫通常由以下几部分组成&#xff1a; - 用户代理&#xff08;User-Agent&#xff09;&#xff1a;模拟浏览器访问&#xff0c;避免被网站识别为机器人。 - 请求处…

Springcould -第一个Eureka应用 --- day02

标题 Eureka工作原理Spring Cloud框架下的服务发现Eureka包含两个组件&#xff0c;分别是&#xff1a;Eureka Server与Eureka Client。Eureka Server&#xff1a;Eureka Client&#xff1a; 搭建Eureka Server步骤&#xff1a;步骤1&#xff1a;创建项目&#xff0c;引入依赖步…