宝藏速成秘籍(3)选择排序法

一、前言

1.1、概念

        选择排序法(Selection Sort)是一种简单直观的排序算法。它的基本思想是:每次从待排序的数组中选择最小(或最大)的元素,将其放在已排序部分的末尾,直到所有元素都排序完毕。

1.2、排序步骤

1.初始化已排序部分和未排序部分:
    - 初始状态下,整个数组为未排序部分。
    - 已排序部分为空。

2.从未排序部分找到最小(或最大)元素:
    - 在未排序部分中查找最小(或最大)的元素。
    - 将该元素的索引保存下来。

3.交换元素:
    - 将找到的最小(或最大)元素与未排序部分的第一个元素交换位置。

4.更新已排序部分和未排序部分:
    - 将未排序部分的第一个元素加入到已排序部分。
    - 未排序部分从原来的第二个元素开始。

5.重复步骤2到4,直到所有元素都排序完毕。

 二、方法分析

       选择排序法逐步将最小元素移动到已排序部分的末尾,最终实现整个数组的排序。选择排序是一种简单且直观的排序算法,适用于小规模数据的排序任务。尽管它的时间复杂度较高,且不是稳定排序,但其实现和理解难度较低。在现代应用中,选择排序更多的是作为算法学习的入门工具,而不是实际排序任务的首选。

三、举例说明 

假设有一个数组:[64, 25, 12, 22, 11]

#### 第一次迭代:
- 未排序部分:[64, 25, 12, 22, 11]
- 找到最小元素 11,与第一个元素 64 交换。
- 交换后数组:[11, 25, 12, 22, 64]
- 已排序部分:[11]
- 未排序部分:[25, 12, 22, 64]

#### 第二次迭代:
- 未排序部分:[25, 12, 22, 64]
- 找到最小元素 12,与第一个元素 25 交换。
- 交换后数组:[11, 12, 25, 22, 64]
- 已排序部分:[11, 12]
- 未排序部分:[25, 22, 64]

#### 第三次迭代:
- 未排序部分:[25, 22, 64]
- 找到最小元素 22,与第一个元素 25 交换。
- 交换后数组:[11, 12, 22, 25, 64]
- 已排序部分:[11, 12, 22]
- 未排序部分:[25, 64]

#### 第四次迭代:
- 未排序部分:[25, 64]
- 最小元素是 25,不需要交换。
- 已排序部分:[11, 12, 22, 25]
- 未排序部分:[64]

#### 第五次迭代:
- 只剩下一个元素 64,它已经在正确位置。
- 数组排序完成:[11, 12, 22, 25, 64]

四、编码实现 

 下面是选择排序法的 Java 实现:

public class SelectionSort {
    public static void selectionSort(int[] arr) {
        int n = arr.length;
        
        // 外层循环遍历数组
        for (int i = 0; i < n - 1; i++) {
            // 假设当前元素是最小的
            int minIndex = i;
            
            // 内层循环找到剩余未排序部分的最小元素
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            
            // 交换找到的最小元素与当前元素的位置
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        System.out.println("排序前的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
        
        selectionSort(arr);
        
        System.out.println("排序后的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

  运行结果:

 五、方法评价

### 时间复杂度
选择排序的时间复杂度为 O(n^2),因为它有两个嵌套的循环,每个循环的时间复杂度为O(n)。
-最坏情况: O(n^2)
-最好情况: O(n^2)
-平均情况: O(n^2)

无论数组是否已排序,选择排序总是进行n(n-1)/2 次比较和最多 (n-1) 次交换。

### 空间复杂度
选择排序是一种原地排序算法,它的空间复杂度为 O(1),因为它只使用了常数级别的额外空间。

### 稳定性
选择排序是一种不稳定的排序算法。例如,对于序列 [4, 3, 3, 1],选择排序在第一次迭代中会将第一个 3 和 1 交换位置,从而破坏了两个 3 的相对顺序。

### 适用性
选择排序适用于数据量较小的情况,因为它的时间复杂度较高。对于大数据集,选择排序的效率较低,不适用于实际应用中的大规模排序任务。

### 优点
1.简单直观: 算法逻辑简单,容易理解和实现。
2.无需额外空间: 由于它是原地排序算法,不需要额外的存储空间。

### 缺点
1.时间复杂度高: O(n^2) 的时间复杂度在数据量较大时性能较差。
2.不稳定: 无法保证相同元素的相对顺序。

 结语 

自学是一项很酷的技能

如果你能坚持下去,那真的是泰酷辣

!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

资源分享—2021版乡级制图规范符号库

汇总整理超图平台软件相关的各类资源&#xff08;包括但不限于符号库、地图模板、地理处理模型等&#xff09;&#xff0c;助力项目的高效制图、提高数据生产效率等业务。 本次分享新版国土空间规划【2021版乡级制图规范符号库】&#xff0c;提供SuperMap格式符号库下载。 符…

简单了解CPU的工作原理

目录 一、基本结构以及对应功能 &#xff08;1&#xff09;基本结构 &#xff08;2&#xff09;几个重要寄存器的详细介绍 操作码 (Opcode) 操作数 (Operands) 指令表 (Instruction Table) 第一个&#xff1a;程序计数器 (PC) 第二个&#xff1a;指令寄存器 (IR&#x…

头歌资源库(3)爬楼梯问题

一、 问题描述 二、算法思想 假设要爬上n阶楼梯&#xff0c;我们可以将问题分解为子问题&#xff1a;爬到第n-1阶楼梯的方法数加上爬到第n-2阶楼梯的方法数加上爬到第n-3阶楼梯的方法数。 设f(n)表示爬到第n阶楼梯的方法数&#xff0c;则有递推关系&#xff1a;f(n) f(n-1…

有声读物管理平台Booksonic-Air

老苏最近在听评书&#xff0c;所以想找个软件来管理和收听&#xff0c;找了一圈&#xff0c;感觉 Booksonic-Air 可能能满足老苏的需求。 什么是 Booksonic-Air &#xff1f; Booksonic-Air 是一个用于流式传输有声读物的服务器&#xff0c;是原始 Booksonic 服务器的后继者。…

windows上运行arm32架构的安卓模拟器

说明 主要功能&#xff1a;在win10上研究和学习32位arm汇编指令的执行 环境如下 主机环境: windows10 目标模拟器环境:armeabi-v7a调试环境搭建 1、下载android studio [下载地址](https://developer.android.com/studio?hlzh-cn) ![在这里插入图片描述](https://img-blog…

RedHat9 | Mariadb数据库的配置与管理

一、实验环境 1、Mariadb数据库介绍 MariaDB数据库管理系统是一个开源的关系型数据库管理系统&#xff0c;与MySQL高度兼容&#xff0c;并提供了更多的功能和性能优化。 起源和背景 MariaDB是MySQL的一个分支&#xff0c;主要由开源社区维护。由MySQL的创始人Michael Widen…

【面试干货】Java集合类详解:List、Set、Queue、Map、Stack的特点与用法

【面试干货】Java集合类详解&#xff1a;List、Set、Queue、Map、Stack的特点与用法 1、Map1.1 特点1.2 用法1.3 常见的实现类 2、Set2.1 特点2.2 用法2.3 常见的实现类 3、List3.1 特点3.2 用法3.3 常见的实现类 4、Queue4.1 特点4.2 用法4.3 常见的实现类 5、Stack5.1 特点5.…

Springboot实现微信小程序登录功能

目录 一 什么是微信登录功能 二 实现微信登录功能的整体逻辑 三 微信登录功能实现步骤 一 什么是微信登录功能 微信小程序登录功能一般用于开发微信小程序的时候&#xff0c;我们需要使用微信授权登录我们的微信小程序&#xff0c;本篇博客就微信小程序实现微信授权登录以及s…

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版 1.环境要求 1.1 软件要求 要顺利运行本代码,请按照以下系统要求进行配置 已经测试过的系统 Linux Ubuntu 22.04.5 kernel version 6.7其他系统可能出现系统兼容性问题。 最低要求 该要求仅针对标准模…

OpenStack入门体验及一键部署

OpenStack入门体验 技能目标&#xff1a; 了解云计算概念 了解OpenStack 了解OpenStack的构成 会OpenStack单机环境一键部署 从控制台认识OpenStack各项功能会 通过OpenStack控制台创建云主机 什么是云计算 云计算(cloudcomputing)是一种基于网络的超级计算模式&a…

Docker安装Nginx(各种错误版)

Docker安装-CSDN博客 安装启动Docker之后 docker run -d -p 81:81 --name nginx nginx 这样没有指定版本 docker run&#xff1a;启动一个新的容器。-d&#xff1a;以分离模式运行容器&#xff08;后台运行&#xff09;。-p 81:81&#xff1a;将主机的 81 端口映射到容器的 …

用Vue3和p5.js打造一个交互式数据可视化仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 Vue.js 集成 p5.js 实现交互式波形图 应用场景介绍 在数据可视化领域&#xff0c;波形图广泛应用于展示动态变化的数据&#xff0c;如声音信号、心跳曲线等。通过动态绘制波形图&#xff0c;用户可以直观…

网络标准架构--OSI七层、四层

OSI七层网络架构&#xff0c;以及实际使用的四层网络架构。

细说ARM MCU的串口发送数据的实现过程

目录 1、条件及工程配置 2、实现串口发送的库函数 3、修改whlie(1)中的代码 4、修改回调函数 5、下载运行 前面的文章介绍了用串口的接收中断来接收数据&#xff0c;本文介绍通过串口从MCU向外发送数据。 1、条件及工程配置 文章依赖的硬件及工程配置同本文作者的其他文…

热门开源项目推荐:智谱GLM-4-9B和ChatGLM3-6B

目录 热门开源项目推荐&#xff1a;智谱GLM-4-9B和ChatGLM3-6B 1.引言 1.1 开源文化简介 1.2 开源项目的重要性 1.3 博客目的和读者价值 2.什么是开源项目&#xff1f; 2.1 开源定义 2.2 开源许可证类型 2.3 开源社区的作用 3.为什么程序员应该关注开源项目&#xff…

javaWeb项目-ssm+jsp学生请假系统功能介绍

本项目源码:java-ssm-jsp学生请假系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL…

HashMap底层源码分析

目录 一、知识点二、数据结构三、resize() 扩容方法四、putVal() 添加数据方法五、remove() 删除方法六、removeTreeNode() 退化链表方法 一、知识点 加载因子: HashMap 的默认的加载因子: 0.75&#xff0c;用来限定阈值&#xff08;用于控制 HashMap 的饱和度&#xff09; 阈值…

适合小白学习的项目1906java Web智慧食堂管理系统idea开发mysql数据库web结构java编程计算机网页源码servlet项目

一、源码特点 java Web智慧食堂管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstra…

uni-app 小程序:显示图片并且点击图片展示大图

效果如图所示&#xff1a; 在页面显示一张图片&#xff0c;然后点击该张图片后显示大图。点击大图就可以关闭大图。 实现的主要代码如下&#xff1a; <image :src"imgpath" mode"aspectFill" click"imgPreview(imgArr)"></image> 其…

LeetCode | 171.Excel表列序号

这道题涉及到字符串和进制转换&#xff0c;首先我们先创建一个A-Z到1-26的map映射&#xff0c;方便我们后续遍历字符串转换&#xff0c;然后对字符串从后往前遍历&#xff0c;依次加上对应权重&#xff0c;注意越往前的权重越大&#xff0c;要记得对应乘上26的对应方数 class …