排序的本质、数据类型及算法选择

news/2025/1/11 7:17:19/

排序的本质、数据类型及算法选择


前两天老金写了篇 “十大排序简介”,有点意犹未尽,这一回老金想把排序连根拔起,从排序的本质说道说道。

一、排序的本质

从字面上理解,排序就是把一堆乱糟糟的东西按照一定的规则排得整整齐齐,使无序变有序。
人喜欢有序,但大自然是喜欢无序的。
排序一词的英文是sort,这个词本来是“分类”的意思。分类是将相似的东西分到一起,表面上看和排序貌似没什么关系,实际上大多数分类都是有序的。
比如,东汉末年分三国,为什么人们都是说魏蜀吴,而不说蜀吴魏?
因为有了人,世间的一切都有了价,有了价便是有了等级。
所谓的排序,本质上就是划分等级。
对于编程来讲,排序就是将数字按从小到大的顺序排列。
没错,无论排什么,最终本质上排的都是数字。
如果把数字看成长短不一的仙人板板,那么,排序前:
在这里插入图片描述
排序后:
在这里插入图片描述
是不是赏心悦目好多?

二、排序的数据类型

常见的用于排序的数据类型有:
1. 数字排序
不要多说,不要多问。这是最基本的排序类型,包括整数、浮点数等。
2. 字符串排序
按字母顺序对单词或句子进行排序,看着是字母,实际上排的是ASCII码,而ASCII码就是数字。
3. 日期和时间排序
要将日期和时间转换为可比较的数值形式,然后进行排序
4. 多维数据排序
包含多个属性的数据,可能需要根据一个或多个属性进行排序。例如,学生的成绩,可以以总成绩为主关键字、以单科成绩为次关键字一起排序
5. 特殊类型数据排序
如地理坐标(经纬度)、版本号(如软件版本号)、IP地址等,它们也有特定的排序规则。

三、排序算法的选择依据

排序算法一上来就10种,为啥要这么多呢?因为没有一种万能的算法能够解决所有问题。
软件工程先天具有复杂性,计算机的世界里有一句名言:

No Silver Bullet in Software Engineering。

幻想一炮就能解决所有问题是不可能的。
排序算法的选择在实际应用中至关重要,因为它直接影响到程序的性能和效率。选择依据如下:
1. 数据规模
如果数据规模很小(比如几十个元素),可以任性一点,选择简单好写的排序算法(比如冒泡排序、选择排序、插入排序)。如果数据规模很大(比如几万、几十万甚至更多个元素),就应选择效率更高的算法(比如快速排序、归并排序)。
2. 算法稳定性
有时,即便两个元素完全相同,排序时也需要保持其原始顺序,这个就叫排序算法的稳定性。比如800对新人的集体婚礼,男方有790人都叫王小二,现在按人名排序出场,如果你把这790个新郎官的次序搞乱了,那妹子们可要几家欢喜几家愁了。如果新娘里有女侠郭芙蓉,势必送你一招“排山倒海”。
在这里插入图片描述

稳定的排序算法有:冒泡排序、插入排序、归并排序、计数排序、桶排序、基数排序
3. 空间复杂度
有些嵌入式系统的内存空间有限,应选择空间复杂度低的算法(比如快速排序、堆排序或插入排序)。
如智能手表为了降低成本、减小体积,内存就比较有限。在智能手表中,需要按时间顺序对心率、步数、睡眠质量等健康数据进行排序,这时候就可以考虑空间复杂度低的排序算法。
4. 数据有序性
如果数据已经有一定的顺序,那插入排序和希尔排序就是比较好的选择。它们能够利用已有的有序序列,减少比较和交换的次数,从而提高效率。
如果数据完全无序,可以选择那些不依赖于数据初始状态的排序算法,比如快速排序和归并排序


http://www.ppmy.cn/news/1562185.html

相关文章

RabbitMQ基础(简单易懂)

什么是RabbitMQ? 它基于AMQP协议(Advanced Message Queuing Protocol),一种为应用构建消息队列的标准协议。过程中,它提供了一些重要模块:为消息发送的Producer(生产者)&#xff0c…

统计有序矩阵中的负数

统计有序矩阵中的负数 描述 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]…

Spring Boot中的依赖注入是如何工作

Spring Boot 中的依赖注入(Dependency Injection,简称 DI)是通过 Spring 框架的核心机制——控制反转(Inversion of Control,IOC)容器来实现的。Spring Boot 基于 Spring Framework,在应用中自动…

CSS语言的文件操作

CSS语言文件操作浅析 CSS(层叠样式表)是一种用于描述HTML文档表现的样式表语言。它负责设置网页的视觉效果,包括文字、颜色、布局等。然而,CSS不仅仅是用于修饰页面,它在现代开发中的作用正变得愈发重要。在本文中&am…

第四章补充:线性代数预备知识(B站:小崔说数)

视频1:向量及方程组 原视频:线性代数预备知识——向量及方程组_哔哩哔哩_bilibili 很多同学没办法把线性代数的前后章节联系到一起,比如第三章的向量组和第四章的方程组它们之间到底有什么关系?为了解决大家的疑惑,我…

后台管理系统-axios网络请求的封装

此博客是针对开源项目:vue3-element-admin 的学习记录,为了帮助自己理清开发这个系统的逻辑. 安装依赖 npm install axios , qsAxios实例封装 // 创建 axios 实例 ,同时给出一些预设配置,比如baseURL,超时时间等等 const service axios.create({base…

verilogHDL仿真详解

前言 Verilog HDL中提供了丰富的系统任务和系统函数,用于对仿真环境、文件操作、时间控制等进行操作。(后续会进行补充) 正文 一、verilogHDL仿真详解 timescale 1ns/1ps //时间单位为1ns,精度为1ps, //编译…

C#里使用libxl里演示输出日期和读取日期数据的例子

日期在EXCEL里也是一种复杂的数据处理, 为什么这样说呢? 因为日期显示,在世界各国里互不相同。 在许多西方国家,日期的表示顺序遵循“日-月-年”的规则,即“Day-Month-Year”,例如:12th January 2023。这种顺序在英语国家中普遍存在,如美国、英国、澳大利亚和加拿大…