“简单易懂的排序:深入了解直接选择排序“

news2024/10/6 6:51:26

文章目录

  • 🔍 选择排序的原理与过程
  • 📈 选择排序的优缺点
  • 👉 代码实现

🔍 选择排序的原理与过程

本文我们直接说一个优化过的直接选择排序。其思路大同小异.

  • 选择排序的思路很简单
    每次从待排序的数据中选择一个最小和最大的元素,最小的存放在序列的起始位置,最大的元素放在序列的尾部,直到全部待排序的数据元素排完 。
  1. 在元素集合array[i]–array[n-1]中选择关键码最大和最小的数据元素.
  2. 找到最大值将其和数据序列末尾交换,找到最小值将其跟数据序列起始位置交换
  3. 在剩余的array[i+1]–array[n-2]集合中,重复上述步骤,直到集合剩余1个元素.

  • 数据演示
    在这里插入图片描述
  1. 第一轮取数结果
    在这里插入图片描述
    在这里插入图片描述
  2. 第二轮取数结果

在这里插入图片描述
在这里插入图片描述
3. 第三轮取数结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a33b3495bdf45afa6dfa544680aa808.png
在这里插入图片描述


📈 选择排序的优缺点

直接选择排序的特性总结:

  • 优点
  1. 实现简单:选择排序的实现非常简单,容易理解和实现,不需要复杂的数据结构或算法思想,适合初学者或快速解决一些小型排序问题。
  2. 空间复杂度低:选择排序只需要用到常数个变量作为辅助空间,不需要额外开辟内存空间来存储排序结果,因此空间复杂度较低.所有他的空间复杂度为O(1)
  • 缺点:
  1. 时间复杂度高:选择排序的时间复杂度为O(n^2),其中n是数组长度,因此性能较差,不适合处理较大规模的数据。
  2. 不稳定:选择排序的交换过程可能会破坏数组中相同大小元素的稳定性,因此选择排序是一种不稳定的排序算法。

👉 代码实现

void SelectSort(int* a, int n)
{
    int begin = 0, end = n - 1; // 定义排序区间的起点和终点
    while (begin < end) // 当起点小于终点时,继续排序
    {
        int maxi = begin, mini = begin; // 定义当前区间最大值和最小值的下标
        for (int i = begin; i <= end; i++) // 遍历当前区间
        {
            if (a[i] > a[maxi]) // 如果当前元素大于最大值,更新最大值下标
            {
                maxi = i;
            }

            if (a[i] < a[mini]) // 如果当前元素小于最小值,更新最小值下标
            {
                mini = i;
            }
        }

        Swap(&a[begin], &a[mini]); // 将最小值和当前区间起点交换位置
        // 如果最大值下标和起点下标重叠,修正一下最大值下标即可
        if (begin == maxi)
        {
            maxi = mini;
        }

        Swap(&a[end], &a[maxi]); // 将最大值和当前区间终点交换位置

        ++begin; // 起点向右移动一位
        --end; // 终点向左移动一位
    }
}

代码实现起来比较简单:
但是要注意一个点如果最大值下标和起点下标重叠,需要做一下处理.

  if (begin == maxi) 
   {
       maxi = mini;
   }

这行代码的意思是判断最大值下标是否和起点下标重叠,如果重叠则最大值已经被移动到了最小值下标处了,需要将最大值下标更新为最小值下标,否则下一步交换操作会将最大值和起点处的元素交换,而不是最大值和终点处的元素交换。举个例子

当待排序数组为 {5, 2, 3, 4, 1} ,第一轮排序时,最小值为1,最大值为5,
第一次swap交换后数组变为 {1, 2, 3, 4, 5},在第二次swap交换时如果没有判断:此时的最大值下标仍然指向起点位置,直接swap交换则数据会变成{5,2,3,4,1},导致排序错误。如加上判断:更新maxi的下标, maxi = mini;此时maxi的下标指向了4,再次swap数据.排序成功。因此,需要判断最大值下标和起点下标是否重叠,如若重叠,需要将最大值下标更新为最小值下标,即maxi=mini。

  • 图析:
  1. 在没有判断条件下进行:
    在这里插入图片描述
    在这里插入图片描述
    此时的maxi还依然指向begin起始位置,再次交换就会出错.
    在这里插入图片描述
  2. 加上判断条件的进行
    在这里插入图片描述
    在这里插入图片描述
    加上判断条件后 if(begin == maxi)成立,则maxi = mini;在这里插入图片描述
    排序成功.
  • 选择排序的优点是简单易懂,缺点是效率低,不适用于大规模数据的排序。在实际应用中,一般用来作为其他排序算法的子过程。但是该选择排序算法还是值得我们去学习摸索的,

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

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

相关文章

记一次rabbitmq消息发送成功,消费丢失问题

记一次rabbitmq消息发送成功&#xff0c;消费丢失问题 背景 测试数据归档&#xff0c;偶现数据未归档 排查 idea线上调试&#xff0c;log日志&#xff0c;数据库消息发送记录&#xff0c;代码分块重复执行看哪块出的问题&#xff0c;结果均无问题&#xff0c;最后使用rabbi…

网关选型对比

网关选型 网关简介 网关是将一个网络与另一个网络进行相互连通&#xff0c;提供特定应用的网络间设备&#xff0c;应用网关必须能实现相应的应用协议。应用网关可以看做是运行于要求特定业务的客户机与提供所需业务的服务器之间的中间过程。应用网关在这类过程中&#xff0c;从…

MySQL练习题(6)

创建两个表插入数据 CREATE DATABASE beifen;use beifen;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL);INSERT INTO booksVALUES (11078, Learning MySQL, 2010),(11033, Study Html, 2011),(11035, How to u…

Linux—实操篇:组管理和权限管理

目录 1、Linux组基本介绍 2、文件/目录 所有者 2.1、查看文件所有者 2.1、修改文件的所有者 3、组的创建 4、文件/ 目录所在组 4.1、查看文件/目录所在组 4.2、修改文件/ 目录所在组 5、其他组 6、改变用户所在组 7、权限基本介绍 8、rwx权限详解 8.1、rwx作用到文…

除了单测、写main方法,还有其他验证方式吗?试试Java JShell吧!

文章首发地址 JShell 概述 Java JShell 是 JDK 9 中引入的一个交互式命令行工具&#xff0c;可以方便地测试 Java 代码片段和进行试验性的 Java 编程。JShell 可以帮助开发人员轻松地创建和测试 Java 代码&#xff0c;而无需编写和运行完整的应用程序或测试用例。以下是 JShe…

了解刚性、惯量、响应时间及伺服增益之间的关系,提高系统的性能和稳定性!

在伺服系统选型及调试中&#xff0c;刚性、惯量、响应时间及伺服增益调整之间的关系错综复杂&#xff0c;这些因素在控制系统中相互影响&#xff0c;对于系统的稳定性和性能至关重要。但在实践中如何调整取值比较合理&#xff0c;这些就算是工程师都会经常感到困惑。所以了解它…

Django 分布式路由

简介&#xff1a; Django中&#xff0c;主路由配置文件(urls.py)可以不处理用户具体路由&#xff0c;主路由的配置文件可以配置成做请求的分发&#xff08;分布式请求处理&#xff0c;分发到子路由而不是具体的视图函数&#xff09;。具体的请求可以由各自的应用来处理。 步骤…

stm32(SPI读写W25Q18)

SPI 是什么&#xff1f; SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总 线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PC…

【Nginx】rewrite简单使用

前言 没有对正式的rewrite进行了解&#xff0c;为了能快速了解它是干嘛怎么用&#xff0c;找了一些有例子的博客进行简单学习了一下&#xff1b;由于每次看的间隔有点大&#xff0c;老忘记&#xff0c;这回专门写个超级快速理解的例子。 PS&#xff1a;下面的解释可能会不太对…

Serverless和EDA是绝配,亚马逊云科技CTO Werner表示需要用开放心态来重新审视架构

前一段有个很火的博客&#xff0c;讲的是一家全球流媒体企业的监测系统从Serverless微服务改成了单体&#xff0c;成本居然降低了90%&#xff01;这一下子可在网上炸锅了&#xff0c;特别是一些看不惯微服务的、单体应用的拥趸&#xff0c;更是坐不住了。但这并不像吃瓜群众看到…

ret2syscall-执行系统调用

题目 checksec一下&#xff1a; 32位程序&#xff0c;没有canary、PIE&#xff0c;开了NX&#xff0c;放入IDA看一下&#xff1a; 有gets&#xff0c;可以溢出&#xff0c;不过没有system函数&#xff0c;也不能执行shellcode&#xff0c;查看字符发现有/bin/sh&#xff0c;那就…

消息中间件系列 - RocketMQ

前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 【尚硅谷】RocketMQ教程丨深度掌握MQ消息中间件_哔哩哔哩_bilibili 第一章 RocketMQ概述 一、MQ概述 1 、MQ简介 MQ&#xff0c;Message Queue&#xff0c;是一种提供消息队列服务的中间件&#…

SpringBoot(七)Filter的使用

思考一个问题&#xff0c;服务端对于客户端的请求&#xff0c;真的应该照单全收吗&#xff1f;不是的。比如拿我们之前实现的用户注册功能来看&#xff0c;如果用户的昵称带了一些不友好的字母或汉字&#xff0c;你是给他过滤掉呢还是让他注册呢&#xff1f;毫无疑问&#xff0…

Zint-条码生成软件-命令行调用-一维条码和二维条码

文章目录 1.Zint简介2.术语3.命令行3.1.输入数据3.2.直接输出3.3.选择条码类型3.4.调整高度3.5.调整空白3.6.添加边界条和框3.7.颜色设置3.8.旋转3.9.调整图像尺寸 4.界面5.总结 1.Zint简介 Zint项目旨在提供一个完整的跨平台开源条形码生成解决方案。该软件包目前包括一个基于…

零拷贝是如何实现的

零拷贝是如何实现的 零拷贝&#xff08;Zero-copy&#xff09;是一种优化技术&#xff0c;用于在数据传输过程中减少数据的拷贝次数&#xff0c;从而提高数据传输的效率和性能。传统的数据传输涉及多次内存拷贝操作&#xff0c;而零拷贝通过减少或避免这些拷贝操作来实现性能优…

HDC.Cloud 2023|邂逅AI,华为云CodeArts铸就研发效能10倍提升

2023年7月7日-9日&#xff0c;华为开发者大会2023&#xff08;Cloud&#xff09;在东莞松山湖隆重举行。期间&#xff0c;华为云主办了以“AI‘邂逅’一站式软件开发&#xff0c;CodeArts以10倍效能“绘”企业应用远景”为主题的分论坛。 华为云PaaS服务产品部副部长汪维敏携一…

用户注册倒计时案例

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…

ORA-00845: MEMORY_TARGET not supported on this system

memory_target的值需要比tmpfs的小。 解决&#xff1a; vim /usr/local/oracle/admin/orcl/pfile/init.ora.6132023154657 强制加载init.ora.6132023154657文件启动数据库 SQL> startup force pfile/usr/local/oracle/admin/orcl/pfile/init.ora.6132023154657;

【原生基础篇】JavaScript中常用的数据输出方式解析

​ 在 JavaScript 中&#xff0c;一般使用如下几种方式进行数据的输出&#xff1a; JavaScript 基础到高级 Canvas游戏开发 原生JavaScipt案例合集 JavaScript DOM基础 1. 在浏览器的控制台输出 浏览器F12打开浏览器控制台(一般前端开发人员必备浏览器为谷歌浏览器&#xff0…

ArcGIS一张图的制作过程

来源&#xff1a;GIS荟 数据 首先&#xff0c;第一步是数据的准备和处理&#xff0c;这里没什么好说的。 使用的所有数据都是在网上下载的 OSM 数据。 第一步 主视觉 为了更好的说明该地图的完整操作过程&#xff0c;同时又要有条理、比较好理解&#xff0c;所以我采用拆分…