【学习分享】小白写算法之选择排序篇

【学习分享】小白写算法之选择排序篇

  • 前言
  • 一、什么是选择排序算法
  • 二、选择排序算法如何实现
  • 三、C语言实现算法
  • 四、复杂度计算
  • 五、算法稳定性
  • 六、小结


前言

简单排序有三种,冒泡排序,插入排序和选择排序。这三种排序的算法算是入门级别的,打好基础再学习更深入的算法。
前两篇文章介绍了冒泡排序和插入排序,本篇学习选择排序。
【学习分享】小白写算法之冒泡排序篇
【学习分享】小白写算法之插入排序篇


一、什么是选择排序算法

选择排序,顾名思义就是每次执行都选择一个最小(或者最大)的数,然后组成一个有序序列。
在这里插入图片描述
如下动图演示了选择排序算法的运行过程,比较直观。
在这里插入图片描述


二、选择排序算法如何实现

我们以数组{6,5,3,2,6,1}为例,每一轮所要做的事就是取出无序序列中的最小值,然后和第i轮的值进行互换,然后循环直到成为有序序列
在这里插入图片描述

每一轮怎么找出最小值呢?以第2轮找2为例。
在这里插入图片描述
总结一下规律:
1、在第i轮需要实现将第i个数和最小数进行互换。
2、查找最小数,需要从j=i+1开始找到最后一个数。
互换的算法我们已经接触很多次了。那么实现起来就比较简单了。


三、C语言实现算法

void selectsort(int arr[],int n)   //选择排序算法
{int i,j,min_idx,temp;for(i=0;i<n-1;i++){min_idx=i;             //标记最小值为第min_idx位,先设定为第i位为最小值。for(j=i+1;j<n;j++)      //从i+1开始遍历查找最小值。{if(arr[j]<arr[min_idx])min_idx = j;}if(i!=min_idx)             //如果i不是最小位,那么第i位和第min_idx位进行互{temp = arr[i];arr[i] = arr[min_idx];arr[min_idx] = temp;}}
}

加入打印后用gcc编译,结果符合预期。
在这里插入图片描述


四、复杂度计算

时间复杂度
跟冒泡排序和插入排序相似,时间复杂度嵌套了两次n,所以选择排序算法时间复杂度是O(n^2).
在这里插入图片描述

空间复杂度计算
四个临时变量i,j,min_idx,temp,所以只需要一个元素的辅助空间即可,空间复杂度为O(1)
在这里插入图片描述


五、算法稳定性

算法稳定性要看相同元素是否会互换,从例子中可以看到,最小值互换后,两个6的相对位置已经发生改变。
在这里插入图片描述
所以选择排序是不稳定的。


六、小结

简单算法对于入门来说是很好的学习方法,只要掌握要领,算法也能变得简单易懂~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/595936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联想 Y9000P 连接网线速度慢 的 问题解决

参考帖子&#xff1a;求助&#xff0c;拯救者Y9000P 2022 i73060版本 有线网非常慢 无线网正常【笔记本吧】_百度贴吧 问题原因&#xff1a; 网卡驱动版本不对。不能用Win11版&#xff0c;要用Win10版。 问题解决&#xff1a; 1、卸载原驱动 2、下载Win10 驱动 并安装 下载…

JavaEE 初阶篇-生产者与消费者模型(线程通信)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…

SpringBoot+ECharts+Html 字符云/词云案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_comment表&#xff0c;表中设置两个字段word与count&#xff0c;添加表中的数据。如&#xff1a;附件中的 echartsdb.sql 3. SpringBoot…

如何选择和注册域名,域名有什么作用,什么是域名解析?域名的需要多少钱?

大家好欢迎来到易极赞&#xff0c;今天我们来跟大家聊一下“如何选择和注册域名”这个话题。 域名用来做什么&#xff1f; 域名对您的网站至关重要&#xff0c;因为它代表您的品牌名称并充当网站的地址。对于企业主来说&#xff0c;一个令人难忘的域名有助于建立在线形象和客户…

使用神经网络-遗传算法优化神经网络-风电预测故障(BP,GABP,matlab)

本项目是故障预测&#xff0c;不是时序预测&#xff0c;本质还是分类问题 1 数据集介绍 特征文件&#xff1a; 标签文件&#xff1a;共计4个标签&#xff0c;其中大多数都是正常的&#xff0c;其他是3个不正常的类别 2 使用BP网络 2.1 读取数据&#xff0c;然后选择几个…

git可视化工具

Gitkraken GitKraken 是一款专门用于管理和协作Git仓库的图形化界面工具。它拥有友好直观的界面&#xff0c;使得Git的操作变得更加简单易用&#xff0c;尤其适合那些不熟悉Git命令行的开发者。GitKraken提供了丰富的功能&#xff0c;如代码审查、分支管理、仓库克隆、提交、推…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

【PyQt5篇】多线程

文章目录 &#x1f354;使用QtDesigner进行设计&#x1f6f8;实现多线程&#x1f339;效果&#x1f50e;原因 &#x1f354;使用QtDesigner进行设计 对应的代码btn.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0">&l…

java——文件上传

一、文件上传——简介 文件上传的简介&#xff1a;文件上传是指将本地计算机中的文件传输到网络上的服务器或另一台计算机上的过程。在 Web 开发中&#xff0c;文件上传通常指的是将用户通过 Web 页面提交的文件&#xff08;如图像、文档、音频、视频等&#xff09;传输到服务器…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…

【Linux】进程初步理解

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 冯诺依曼体系结构1.1 认识冯诺依曼体系结构1.2 存储金字塔 2. 操作系统2.1 概念2.2 结构2.3 操作系统的管理 3. 进程3.1 进程描述3.2 Linux下的PCB 4. task_struct本身内部属性4.1 启动4.2 进程的创建方式4.2.1 父…

2024.4.5-[作业记录]-day10-CSS 布局模型(层模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.5-学习笔记1 CSS定位1.1 相对定位 relative1.2 绝对定位 absolut…