排序算法--直接选择排序

news2024/7/6 19:42:44

前提:

        选择排序:选择排序(Selection sort)是一种比较简单的排序算法。它的算法思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

  话不多说,直接放图:

这里每次找到最小的那个元素,将其与未排序序列的第一个元素交换,交换后最小的那个元素已经找到,再从未排序序列中找第二小的元素......直到序列完全有序。

直接选择排序: 

          直接选择排序,顾名思义,直接选择最小或最大的数。它的思想完全契合选择排序的思想,这里就不再过多赘述。

 直接排序的过程:

手敲的代码: 

​ 

这里我们的思路就是定义一个变量begin,作为未排序序列的第一个数,定义一个变量mini保存最小数的下标。然后从第begin+1个数开始遍历整个序列,如果找到比a[mini]还小的数,就将mini更新为该数的下标。遍历完后就将mini位置的数交换到begin处。最小数确定后,begin++;再遍历剩下的序列,找第二小的数.......直到完全有序。

有没有觉得这样每循环一次仅选一个数出来有点浪费?不如我们直接一次选两个数怎么样?

微调版直接选择排序代码分析:

  根据我们上面的分析,改动版的的代码就是一次完成最大、最小两个数的排序,实际上与一个数的排序并没有什么不同。 

 依旧是手敲代码:

 

这里无非是多定义了两变量,end与maxi。end控制尾部的变化。一次交换完成后,序列找到最大值和最小值,begin++,end--;继续找未排序序列里的最大值和最小值。

运行代码也是没什么问题。但是,我们一直用一组数据测也没啥意思,换下面这组组数据玩玩:

有没有发现不一样了?我们的排序是完全不正确。

遇事不决,调试代码:

1、                                                                  2、

3、                                                                4、

有没有看出问题?

     我们的最大的数是13,第一次交换时最小值a[6]=0与a[0]=13交换后,最大值的下标maxi还是0。导致后面最大值和end交换的就不是最大值!更要命的,一次交换完,begin和end收缩,a[0]与a[10]的位置已经固定,无法再改动,导致程序越运行越错。

     找到了问题,方法就会有:因为第一次与a[0]交换的一定是最小值(这里的特殊错误是因为begin里放的是整个序列的最大值导致的),所以我们可以加个判断:

当最大值碰巧在begin位置上,交换了最小值后就将maxi更新到mini的位置(如上图就是maxi从下标为0更新到下标为6的位置)。以此来防止最大值的丢失。

直接选择排序的时间复杂度:

 时间复杂度为铁铁的O(n^2),最好是直接有序为O(n);

直接选择排序的是不稳定的排序:

注意到上面演示排序过程中两个6的变化了吗?

很明显两个6的位置发生了变化,因此是不稳定的排序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xamarin.Android项目显示Properties

在 Visual Studio 2022 中,如果您需要调出“Properties”(属性)窗口,您可以使用以下几种方法: 快捷键: 您可以按 F4 快速打开当前选择项的“Properties”窗口。

postman中百度preview无法加载的解决方案

问题 在使用postman关联时,百度接口与天气接口已使用glb_city关联,但在百度接口发送请求时,发现preview无法加载 解决方案 1、进入百度 百度全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中…

【云原生】Docker 实践(二):什么是 Docker 的镜像

【Docker 实践】系列共包含以下几篇文章: Docker 实践(一):在 Docker 中部署第一个应用Docker 实践(二):什么是 Docker 的镜像Docker 实践(三):使用 Dockerf…

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后,在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后,再次下载鸿蒙开发软件,竟然发现打不开。 下载鸿蒙系统 下载地址:http…

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议,建立在FTP协议之上 2.http请求 3.http响应 请求响应报文参考:https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面

文章目录 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面1.打印异常堆栈2.去除第三方app的倒计时页面3.模拟点击事件跳过首页进入主页 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41)&#x…

SpringCloud微服务项目创建流程

为了模拟微服务场景,学习中为了方便,先创建一个父工程,后续的工程都以这个工程为准,实用maven聚合和继承,统一管理子工程的版本和配置。 后续使用中只需要只有配置和版本需要自己规定之外没有其它区别。 微服务中分为…

MLP实现fashion_mnist数据集分类(2)-函数式API构建模型(tensorflow)

使用函数式API构建模型,使得模型可以处理多输入多输出。 1、查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、fashion_mnist数据集分类模型 2.1 使用Sequential构建…

4 Spring AOP

目录 AOP 简介 传统开发模式 先来看一个需求 解决方案 AOP 图示 Spring 启用 AspectJ 基于 xml 配置 创建 pom.xml 创建 UserService 借口和 UserServiceImpl实现类 创建 LogAdvice 日志通知 创建 log4j.properties 重点:创建 spring-context-xml.xml 配…

MyBatis:mybatis基础操作

MyBatis基础操作 新增 接口方法 Insert() insert();删除 接口方法 Delete() delete();Delete("delete from emp where id #{id}") public abstract void delete(Integer id) //如果只传了一个形参,括号内可以随意写修改 接口方法 Update() update();查询 接…

Jupyter Notebook魔术命令

Jupyter Notebook是一个基于网页的交互式笔记本,支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序,便于创建和共享文学化程序文档,支持实现代码,数学方程,可视化和markdown。用途包括:数据…

MATLAB中自定义栅格数据地理坐标R,利用geotifwrite写入tif

场景描述: 有时候将nc格式的数据转成tiff,或者是将一个矩阵输出成带有地理坐标信息tiff数据时,常常涉及到空间参考的定义和geotiffwrite()函数。 问题描述: 以全球数据为例,今天发现在matlab中对矩阵进行显示后&…

【大模型学习】大模型相关概念

知识库 Embeding 嵌入,又称向量化、矢量化。 Prompt engineer 提示词工程 提示工程技巧 RAG 检索增强生成,提高文本的准确性和丰富性。 Fine tuning 微调,优化已有人工智能模型以适应特定任务的技术。 AI agent AI代理人&…

华为机考入门python3--(19)牛客19- 简单错误记录

分类:字符串 知识点: 分割字符串 my_str.split(\\) 字符串只保留最后16位字符 my_str[-16:] 列表可以作为队列、栈 添加元素到第一个位置 my_list.insert(0, elem) 增加元素到最后一个位置 my_list.append(elem) 删除第一个 my_list.pop(0)…

Python中的数据可视化:阶梯图matplotlib.pyplot.step()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 Python中的数据可视化: 阶梯图 matplotlib.pyplot.step() [太阳]选择题 matplotlib.pyplot.step()的功能是? import matplotlib.pyplot as plt import numpy as…

基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

机器视觉系统-条形光源安装位置计算

使用条形光对反光材质物体打光时,常常出现强烈的光斑反射,影响图像处理。如果不想图像中出现光源的光斑,可以通过计 算得出条形光源的安装范围。 检则PCB板上的二维码字符,使用两个条形光打光的效果图 以及等效模型: …

CSS 鼠标经过放大元素 不影响其他元素

效果 .item:hover{transform: scale(1.1); /* 鼠标悬停时将元素放大 1.1 倍 */ }.item{transition: transform 0.3s ease; /* 添加过渡效果,使过渡更加平滑 */ }

esp32-cam 2. python opencv 拉取摄像头内容

0. 环境 - win10 python3 - pycharm - esp32-cam http://192.168.4.1 1. 创建工程 File -> Create Project -> -> Location: E:\Workspaces\PycharmProjects\esp32cam_opencv -> Create 2. opencv hello 2.1 添加脚本 File -> New -> Python f…