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

【排序算法】③直接选择排序

系列文章目录

 第一篇:【排序算法】①直接插入排序-CSDN博客

第二篇:【排序算法】②希尔排序-CSDN博客

第三篇:【排序算法】③直接选择排序-CSDN博客

第四篇:【排序算法】④堆排序-CSDN博客


目录

系列文章目录

前言

一、直接选择排序是什么?

算法思想

二、实现直接选择排序

三、分析直接选择排序

直接选择排序的特征

与直接插入排序的区别

总结



前言

直接选择排序比较简单,实现起来较容易,但是直接选择排序与直接插入排序的区别难以理清,笔者下方整理一个表格供参考。


一、直接选择排序是什么?

算法思想

直接选择排序的思想是:

每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。 通过不断选择剩余元素中的最小者来实现排序。

直接选择排序为什么能实现排序?
很好理解,假设i=0是数组下标,n是数据个数。直接选择排序就是简单粗暴的从未排序的数据集中挑出最小/最大,放在第i个位置处,i++,未排序的数据个数就变成n-i个,重复直到i==n-1(数组下标)。

二、实现直接选择排序

博主这里以升序为例:

void SelectionSort(int* a, int n)
{if (!a)return;for (int i = 0; i < n; ++i){int _min = i;for (int j = i + 1; j < n; j++){if (a[j] < a[_min])_min = j;}swap(&a[i], &a[_min]);}
}void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}

依据算法,从数据集中,挑选处特征码最小/最大的数据放在已排序的末尾。

①_min变量用于存储合适数据的下标。从第i号,到之后的未排数据中选择最小或最大的数据,_min保存其下标,等内循环结束交换数据值;

②外循环,每一次循环的目的是在未排数据中寻找最小/最大的值;内循环,作用是依次拿未排数据与a[i]比较大小。

三、分析直接选择排序

直接选择排序的特征

1. 直接选择排序非常好理解,但是效率不是很好,故实际中很少使用;
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定。

与直接插入排序的区别

直接选择排序与直接插入排序的区别是什么?

直接选择排序: 每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。 通过不断选择剩余元素中的最小者来实现排序。

直接插入排序: 将未排序部分的元素逐个插入到已排序部分的适当位置。 即,将元素插入到已排序序列中的正确位置,从而逐步构建有序序列。

特性直接选择排序直接插入排序
基本思想在未排序序列中选择最小元素放入已排序序列末尾将未排序元素插入已排序序列的合适位置
操作核心选择 + 交换比较 + 移位
时间复杂度永远 O(n²)(任何情况平均 O(n²),但有序时最优 O(n)
空间复杂度O(1)(原地)O(1)(原地)
稳定性 不稳定(交换破坏顺序)稳定(保持相同元素顺序)
数据敏感性无关数据分布(固定比较次数)强相关(有序数据效率飙升)
交换/移动次数交换次数少(n-1次)移动次数多(需整体移位)


总结

本文是【排序算法】系类第三篇,直接选择排序较为简单故篇幅较短。

来不及怀念直接选择排序了,接下来登场的是常用且效率高、结构较复杂的另一种选择排序算法:堆排序!

http://www.dtcms.com/a/322510.html

相关文章:

  • 深入解析 Apache APISIX 在微服务网关中的性能优化实践指南
  • C语言(10)——结构体、联合体、枚举
  • ARM体系结构
  • cross-env dotenv
  • 【QuPath 】QuPath 批量提取 SVS 文件元数据脚本
  • NLP:Transformer输出部分
  • DigitalProductId解密算法php调试版piddebug.php
  • Day02 员工管理,分类管理
  • 【线性代数】其他
  • 【Redis7.x】docker配置主从+sentinel监控遇到的问题与解决
  • 【LeetCode 热题 100】(六)矩阵
  • 解决本地连接服务器ollama的错误
  • 网站站长如何借助php推送示例提交网站内容加速百度收录?
  • 【26】C#实战篇—— 多个线程函数对同一个 Excel 文件进行写操作引起的文件冲突问题,解决方法
  • 代码随想录day60图论10
  • 使用 Ansys Discovery 进行动态设计和分析
  • Mac屏幕取色不准?探究原理和换算规则
  • Linux文件系统基石:透彻理解inode及其核心作用
  • LeetCode111~130题解
  • ABP VNext + Akka.NET:高并发处理与分布式计算
  • 【AGI】GPT-5:博士级AI助手的全面进化与协作智能时代的黎明
  • 如何输出一篇高质量的版本测试策略
  • WebGIS视角下基孔肯雅热流行风险地区分类实战解析
  • jupyter服务器创建账户加映射对外账户地址
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • React中实现完整的登录鉴权与权限控制系统
  • (一)React复习小满(userImmer/userMemo/useContext/userCallback/userRef)
  • 需求评审需要哪些角色参与
  • 嵌入式 - Linux软件编程
  • Web文件上传:本地与云存储实战