当前位置: 首页 > web >正文

排序算法——选择排序

一、介绍

「排序算法sortingalgorithm」用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用,因为有序数据通常能够被更有效地查找、分析和处理。

如图所示,排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定,如数字大小、字符ASCII码顺序或自定义规则。

二、评价维度

1.运行效率:我们期望排序算法的时间复杂度尽量低,且总体操作数量较少(即时间复杂度中的常数项降低)。对于大数据量情况,运行效率显得尤为重要。
2.就地性:顾名思义,「原地排序」通过在原数组上直接操作实现排序,无须借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。
3.稳定性:「稳定排序」在完成排序后,相等元素在数组中的相对顺序不发生改变。稳定排序是多级排序场景的必要条件。假设我们有一个存储学生信息的表格,第1列和第2列分别是姓名和年龄。在这种情况下,「非稳定排序」可能导致输入数据的有序性丧失。

# 输入数据是按照姓名排序好的

# (name, age)

('A', 19)

('B', 18)

('C', 21)

('D', 19)

('E', 23)

# 假设使用非稳定排序算法按年龄排序列表,
# 结果中 ('D', 19) 和 ('A', 19) 的相对位置改变,
# 输入数据按姓名排序的性质丢失
('B', 18)
('D', 19)
('A', 19)
('C', 21)
('E', 23)

4.自适应性:「自适应排序」的时间复杂度会受输入数据的影响,即最佳、最差、平均时间复杂度并不完全相等。 自适应性需要根据具体情况来评估。如果最差时间复杂度差于平均时间复杂度,说明排序算法在某些数据下性能可能劣化,因此被视为负面属性;而如果最佳时间复杂度优于平均时间复杂度,则被视为正面属性。

5.是否基于比较:「基于比较的排序」依赖于比较运算符()来判断元素的相对顺序,从而排序整个数组,理论最优时间复杂度为𝑂(𝑛log𝑛)。而「非比较排序」不使用比较运算符,时间复杂度可达𝑂(𝑛), 但其通用性相对较差。

理想排序算法
运行快、原地、稳定、正向自适应、通用性好。显然,迄今为止尚未发现兼具以上所有特性的排序算法。因此,在选择排序算法时,需要根据具体的数据特点和问题需求来决定。

三、选择排序

1.实现原理

「选择排序selectionsort」的工作原理非常直接:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。设数组的长度为𝑛,选择排序的算法流程如下所示:
1. 初始状态下,所有元素未排序,即未排序(索引)区间为[0,𝑛−1]。
2. 选取区间[0,𝑛−1]中的最小元素,将其与索引0处元素交换。完成后,数组前1个元素已排序。
3. 选取区间[1,𝑛−1]中的最小元素,将其与索引1处元素交换。完成后,数组前2个元素已排序。
4. 以此类推。经过𝑛−1轮选择与交换后,数组前𝑛−1个元素已排序。
5. 仅剩的一个元素必定是最大元素,无须排序,因此数组排序完成。

2.代码

def selection_sort(nums: list[int]):""" 选择排序"""n = len(nums)# 外循环:未排序区间为 [i, n-1]for i in range(n-1):# 内循环:找到未排序区间内的最小元素k = ifor j in range(i + 1, n):if nums[j] < nums[k]:k = j # 记录最小元素的索引# 将该最小元素与未排序区间的首个元素交换nums[i], nums[k] = nums[k], nums[i]nums = [5, 2, 4, 6, 1, 3]
selection_sort(nums)
print(nums)

3.算法特性

‧ 时间复杂度为𝑂(n^{2})、非自适应排序:外循环共𝑛−1轮,第一轮的未排序区间长度为𝑛,最后一轮 的未排序区间长度为2,即各轮外循环分别包含𝑛、𝑛−1、…、3、2轮内循环,求和为(𝑛−1)(𝑛+2)/2

‧ 空间复杂度𝑂(1)、原地排序:指针𝑖和𝑗使用常数大小的额外空间。

‧ 非稳定排序:如图所示,元素nums[i] 有可能被交换至与其相等的元素的右边,导致两者相对顺序发生改变。

http://www.xdnf.cn/news/3184.html

相关文章:

  • 微格式:为Web内容赋予语义的力量
  • 【Linux 网络】网络工具ifconfig和iproute/iproute2工具详解
  • 端到端观测分析:从前端负载均衡到后端服务
  • 进程、线程、进程间通信Unix Domain Sockets (UDS)
  • 《操作系统真象还原》第十一章——用户进程
  • Spring 框架中的常见注解讲解
  • Qt窗口关闭特效:自底而上逐渐消失
  • google colab设置python环境为python3.7
  • 提高程序灵活性和效率的利器:Natasha动态编译库【.Net】
  • 【学习笔记】Shell编程--Bash变量
  • HBuider中Uniapp去除顶部导航栏-小程序、H5、APP适用
  • 线上婚恋相亲小程序源码介绍
  • Learning vtkjs之ImageMarchingSquares
  • 国内免费连接claude-3-7大模型操作教程
  • 数据库系统综合应用与深度实践指南
  • VINS-FUSION:配置参数说明与配置自己的参数
  • 【XR】MR芯片 和 VR芯片之争
  • Linux:文件操作
  • FEKO许可配置
  • C++负载均衡远程调用学习之Reactor事件触发机制
  • Python3(19)数据结构
  • 第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题
  • 涨薪技术|0到1学会性能测试第43课-apache status模块监控
  • halcon关闭图形窗口
  • 论文阅读:2024 ICML In-Context Unlearning: Language Models as Few-Shot Unlearners
  • Flink之DataStream
  • URP - 公告牌的效果实现
  • Keysight万用表使用指南及基于Python采集数据生成Excel文件
  • Solon Cloud Gateway 补充
  • 配置 Odoo 的 PostgreSQL 数据库以允许远程访问的步骤