当前位置: 首页 > 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.lryc.cn/news/615291.html

相关文章:

  • 心灵笔记:思考三部曲
  • 使用 Spring Boot 集成七牛云实现图片/文件上传
  • 机器翻译:FastText算法详解与Python的完整实现
  • istio笔记03--快速上手多集群mesh
  • 支持 UMD 自定义组件与版本控制:从 Schema 到动态渲染
  • [FOC电机控制]霍尔传感器于角度问题
  • 贪心----1.买卖股票的最佳时机
  • GoEnhance AI-AI视频风格转换工具
  • 利用whisper api实现若无字幕则自动下载音频并用 whisper 转写,再用 LLM 总结。
  • 飞算JavaAI:人工智能与Java的创新融合与应用前景
  • Klipper-G3圆弧路径算法
  • 四、RuoYi-Cloud-Plus 部署时nacos配置服务启动
  • 驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
  • 最长回文子串(马拉车/Manacher‘s )算法
  • Android 设置/修改系统NTP服务地址
  • 【Avalonia】无开发者账号使用iOS真机调试跨平台应用
  • 提示条贴合右侧边栏
  • Java 大视界 -- Java 大数据在智能家居场景联动与用户行为模式挖掘中的应用(389)
  • 虚拟机Ubuntu重启发现找不到共享文件夹
  • 2025AI颠覆认知!解锁智能新纪元
  • ubuntu修改密码
  • Java基础-TCP通信(多发多收和一发一收)
  • webrtc弱网-BandwidthQualityScaler 源码分析与算法原理
  • 基于 RAUC 的 Jetson OTA 升级全攻略
  • RAGFoundry:面向检索增强生成的模块化增强框架
  • 功能测试中常见的面试题-一
  • DataDex 多样化 JSON 服务——使用教程
  • linux php版本降级,dnf版本控制
  • 在CoT中为什么仅用方程式提示不够
  • drippingblues靶机教程