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

【数据结构】排序算法系列——选择排序(附源码+图解)

选择排序

算法思想

选择排序的思想与插入排序其实有异曲同工之处,它们都会对数据进行比较和交换,但是它们也还是有很大的差别:插入排序是两两元素之间进行比较,而选择排序是将最值的元素同其他元素依次进行比较,从而按照最大(或最小)、第二大、第三大这样的顺序进行数组的重组。

它的大致步骤如下:

  1. 第一次从待排序的数据元素中选出**最小(或最大)**的一个元素,存放在序列的起始(末尾)位置
  2. 然后选出**次小(或次大)**的一个元素,存放在最大(最小)元素的下一个位置
  3. 重复这样的步骤直到全部待排序的数据元素排完

图解

请添加图片描述

C语言代码分析

//选择排序
void SelectSort1(int* a, int n);
void SelectSort2(int* a, int n);//1.只进行最小值或者最大值的交换
void SelectSort1(int* a, int n)
{int left = 0;int right = n - 1;while (left < right){int min = left;//指定目前最小值为第一个元素for (int i = left + 1; i <= right; i++){if (a[i] < a[min])//如果有比目前最小值更小的元素,就更新最小值,进行交换{min = i;}}if (min != left)//如果最小值不是第一个元素,就进行Swap交换{int temp = a[min];a[min] = a[left];a[left] = temp;}left++;//每完成一次交换,左指针向右移动一位,进行下一次交换}
}//2.最小值和最大值同时进行交换,优点是减少了交换次数,在一定程度上提高了效率
void SelectSort2(int* a, int n)//选择排序
{int left; int right = n - 1;//左右指针while (left < right){int min = left, max = right;//最小值和最大值的下标for(int i=left+1;i<=right;i++){if (a[i] < a[min])//找最小值min = i;if (a[i] > a[max])//找最大值max = i;}if (min != left){//进行一次Swap交换int temp = a[min];a[min] = a[left];a[left] = temp;}//如果最大值和最小值相等,说明最大值和最小值是同一个元素,只需要进行一次交换//如果继续交换max,就会将最小值交换到末尾位置。if (left = right){right = min;}left++;right--;}

时间复杂度

选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为O(n2)

稳定性

鉴于选择排序会改变前后元素的相对位置,所以:不稳定


http://www.mrgr.cn/news/22540.html

相关文章:

  • 华为OD机试真题 - 考古学家 - 递归(Python/JS/C/C++ 2024 D卷 200分)
  • Exchange 服务器存档配额配置方法及注意事项
  • 手撕Python之生成器、装饰器、异常
  • Linux压缩、解压缩、查看压缩内容详解使用(tar、gzip、bzip2、xz、jar、war、aar)
  • Python知识点:如何使用Python进行Excel文件操作(OpenPyXL、Pandas)
  • 【文档规范】嵌入式软件代码开发测试文档
  • AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
  • tensorflow-MLP python入门
  • 【LVI-SAM】激光雷达点云地图优化LIO-SAM 之mapOptimization实现细节
  • Maven项目父模块POM中不应包含实际依赖(dependency)
  • 详细分析Mysql配置文件路径的查找(多种方法)
  • 详细分析linux中的MySql跳过密码验证以及Bug(图文)
  • Linux查找文件 find、locate、grep等使用说明
  • EmguCV学习笔记 VB.Net 11.3 DNN其它
  • Docker 部署 Nacos (图文并茂超详细)
  • SpringBoot项目是如何启动
  • 【NOI】C++算法入门之递归基础(数值类)
  • ssm鲜花销售微信小程序 LW PPT调试源码
  • 网上花店管理系统小程序的设计
  • C++第一节入门