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

八大排序——简单选择排序

目录

1.1基本操作:

1.2动态图:

1.3代码:

代码解释

1. main 方法

2. selectSort 方法

示例运行过程

初始数组

每轮排序后的数组

最终排序结果

代码总结


1.1基本操作:

选择排序(select sorting)也是一种简单的排序方法。

它的基本思想是:第一次从arr[0到]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]到arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]到arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

1.2动态图:

1.3代码:

public class Insert {public static void main(String[] args) {int[] arr = {8,65,41,28,6,1,4,5,32,9,10};System.out.println("排序前");System.out.println(Arrays.toString(arr));selectSort(arr);}public static void selectSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {//寻找最小值,将当前的作为最小值来看待int minIndex = i;int min = arr[i];for (int j = i + 1; j < arr.length; j++) {// 当前值的下一个值和当前值判断大小,如果先一个值小,那么就进行交换 ,// 当然要记录一下当前值的 下标 ,目的是为了当前值和第一个值进行交换if (min > arr[j]) {min = arr[j];minIndex = j;}}//进行交换arr[minIndex] = arr[i];arr[i] = min;System.out.println("第" + (i + 1) + "轮后");System.out.println(Arrays.toString(arr));}}
}

代码解释

1. main 方法

public static void main(String[] args) {
    int[] arr = {8, 65, 41, 28, 6, 1, 4, 5, 32, 9, 10};
    System.out.println("排序前");
    System.out.println(Arrays.toString(arr));
    selectSort(arr);
}

  • 功能:程序的入口。

  • 逻辑

    • 定义了一个未排序的整数数组 arr

    • 打印排序前的数组。

    • 调用 selectSort 方法对数组进行排序。

2. selectSort 方法

public static void selectSort(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        // 寻找最小值,将当前的作为最小值来看待
        int minIndex = i;
        int min = arr[i];
        for (int j = i + 1; j < arr.length; j++) {
            // 当前值的下一个值和当前值判断大小,如果下一个值小,那么就更新最小值和最小值的下标
            if (min > arr[j]) {
                min = arr[j];
                minIndex = j;
            }
        }
        // 进行交换
        arr[minIndex] = arr[i];
        arr[i] = min;
        System.out.println("第" + (i + 1) + "轮后");
        System.out.println(Arrays.toString(arr));
    }
}

  • 功能:实现选择排序算法。

  • 逻辑

    1. 外层循环

      • 遍历数组,从第一个元素到倒数第二个元素(i 从 0 到 arr.length - 2)。

      • 每次循环的目的是找到未排序部分的最小值,并将其放到已排序部分的末尾。

    2. 初始化最小值和最小值的下标

      • minIndex 记录当前最小值的下标,初始值为 i

      • min 记录当前最小值,初始值为 arr[i]

    3. 内层循环

      • 从 i + 1 开始遍历未排序部分。

      • 如果找到比 min 更小的值,则更新 min 和 minIndex

    4. 交换最小值

      • 将找到的最小值与当前外层循环的位置 i 的值进行交换。

    5. 打印每轮排序后的数组

      • 每轮排序后,打印当前数组的状态。


示例运行过程

初始数组

[8, 65, 41, 28, 6, 1, 4, 5, 32, 9, 10]

每轮排序后的数组

  1. 第1轮

    • 找到最小值 1,与第一个元素 8 交换。

    • 结果:[1, 65, 41, 28, 6, 8, 4, 5, 32, 9, 10]

  2. 第2轮

    • 找到最小值 4,与第二个元素 65 交换。

    • 结果:[1, 4, 41, 28, 6, 8, 65, 5, 32, 9, 10]

  3. 第3轮

    • 找到最小值 5,与第三个元素 41 交换。

    • 结果:[1, 4, 5, 28, 6, 8, 65, 41, 32, 9, 10]

  4. 第4轮

    • 找到最小值 6,与第四个元素 28 交换。

    • 结果:[1, 4, 5, 6, 28, 8, 65, 41, 32, 9, 10]

  5. 第5轮

    • 找到最小值 8,与第五个元素 28 交换。

    • 结果:[1, 4, 5, 6, 8, 28, 65, 41, 32, 9, 10]

  6. 第6轮

    • 找到最小值 9,与第六个元素 28 交换。

    • 结果:[1, 4, 5, 6, 8, 9, 65, 41, 32, 28, 10]

  7. 第7轮

    • 找到最小值 10,与第七个元素 65 交换。

    • 结果:[1, 4, 5, 6, 8, 9, 10, 41, 32, 28, 65]

  8. 第8轮

    • 找到最小值 28,与第八个元素 41 交换。

    • 结果:[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]

  9. 第9轮

    • 找到最小值 32,与第九个元素 32 交换(无需交换)。

    • 结果:[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]

  10. 第10轮

    • 找到最小值 41,与第十个元素 41 交换(无需交换)。

    • 结果:[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]


最终排序结果

[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]

代码总结

  • 算法:选择排序。

  • 时间复杂度:O(n²),其中 n 是数组的长度。

  • 空间复杂度:O(1),原地排序,不需要额外的空间。

  • 优点:实现简单,适合小规模数据。

  • 缺点:时间复杂度较高,不适合大规模数据。

相关文章:

八大排序——简单选择排序

目录 1.1基本操作&#xff1a; 1.2动态图&#xff1a; 1.3代码&#xff1a; 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作&#xff1a; 选择排序&#xff08;select sorting&#xff09;也…...

vue使用CSS布局技术,实现div定位到页面底部或顶部并居中功能

<template> <div > <div class"bottom-element"> 我在底部&#xff0c;并居中了 </div> </div> </template> 使用CSS布局技术&#xff0c;通过设置CSS属性来实现页面底部定位。 <style lang"scs…...

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…...

【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】

在本文中&#xff0c;我们将介绍如何使用 FastAPI和uvicorn来同时运行HTTP和HTTPS的 Python应用程序。 简介 FastAPI是一个高性能的Web框架&#xff0c;可以用于构建快速、可靠的API。它基于Python的类型提示和异步支持&#xff0c;使得开发者可以轻松地编写出安全且高效的代…...

HCIA-路由器相关知识和面试问题

二、 路由器 2.1 关于路由器的知识 2.1.1 什么是路由器 路由器是一种网络层互联设备&#xff0c;主要用于连接多个逻辑上分开的网络&#xff0c;实现不同网络之间的数据路由和通信。它能根据网络层地址&#xff08;如 IP 地址&#xff09;来转发数据包&#xff0c;在网络中起…...

Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】

文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …...

PCL 点云数学形态学操作(腐蚀)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 基本原理:使用结构元素(通常为滤波的窗口)的窗口模板作为处理单元,利用形态学中的膨胀与腐蚀相组合即可达到滤波的效果。 点云数据中的数学形态学运算其实和二维图像上的运算非常相似,图像上像素有x,y和亮度值…...

【设计模式】【行为型模式】观察者模式(Observer)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

RAGFlow和Dify对比

‌ RAGFlow和Dify都是基于大语言模型&#xff08;LLM&#xff09;的应用开发平台&#xff0c;具有相似的功能和应用场景&#xff0c;但它们在技术架构、部署要求和用户体验上存在一些差异。‌‌ RAGFlow和Dify对比 2025-02-13 22.08 RAGFlow‌ ‌技术栈‌&#xff1a;RAGFlow…...

AI前端开发:蓬勃发展的机遇与挑战

人工智能&#xff08;AI&#xff09;领域的飞速发展&#xff0c;正深刻地改变着我们的生活方式&#xff0c;也为技术人才&#xff0c;特别是AI代码生成领域的专业人士&#xff0c;带来了前所未有的机遇。而作为AI应用与用户之间桥梁的前端开发&#xff0c;其重要性更是日益凸显…...

结构型模式---代理模式

概念 代理模式是一种结构型模式&#xff0c;主要用于在客户端和接口之间添加一个中间层&#xff0c;用于在客户端和接口之间进行权限控制或者其他的中间层操作。 使用场景 1、延缓初始化&#xff0c;当我们偶尔需要使用一个重量级的服务对象&#xff0c;如果一直保持该对象的…...

Java面向对象一:相关概念

面向过程&面向对象 面向过程思想 步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么… 面对过程适合处理一些较为简单的问题面向对象思想 物以类聚&#xff0c;分类的思维模式&#xff0c;思考问题首先会解决问题需要哪些分类&#xff0c;然后对这些分类进行…...

CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)

1. 引言 在 CEF132&#xff08;Chromium Embedded Framework&#xff09;的编译过程中&#xff0c;depot_tools 扮演着举足轻重的角色。这套由 Chromium 项目精心打造的脚本和工具集&#xff0c;专门用于获取、管理和更新 Chromium 及其相关项目&#xff08;包括 CEF&#xff…...

React VS Vue

React 和 Vue 是目前最流行的两个前端框架&#xff0c;它们在设计理念、生态系统和开发体验上各有特点。以下是对 React 和 Vue 的全方位对比&#xff1a; 1. 核心设计理念 React 库而非框架&#xff1a;React 是一个用于构建 UI 的库&#xff0c;专注于视图层&#xff0c;其…...

伺服报警的含义

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#的运动控制程序的时候&#xff0c;一个必要的步骤就是设置伺服报警信号的…...

CSS 属性选择器详解与实战示例

CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器&#xff0c;它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中&#xff0c;属性选择器不仅可以提高代码的可维护性&#xff0c;而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例&#xff0c;从基础…...

基于STM32、HAL库、HS12864(ST7920,并行接口)C语言程序设计

1、hs12864.h头文件: #ifndef __HS12864_H #define __HS12864_H #ifdef __cplusplus extern "C" {#endif #include "stm32l4xx_hal.h" // 控制线定义 - 根据实际硬件修改 #define HS12864_RS_GPIO_PORT GPIOC #define HS12864_RS_PIN GPIO_PI…...

Python练习11-20

题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 题目&#xff1a;判断101-200之间有多少…...

探索ELK 的魅力

在大数据时代&#xff0c;海量日志和数据的收集、存储、处理与可视化分析变得越来越重要。而 ELK 堆栈&#xff0c;由 Elasticsearch、Logstash、Beats 和 Kibana 组成&#xff0c;正是一个强大的开源解决方案&#xff0c;帮助开发者和运维人员高效管理和分析日志数据。本文将详…...

【ROS2综合案例】乌龟跟随

一、前期准备 1.1 安装 1. 首先安装“乌龟跟随”案例的功能包以及依赖项。 安装方式1&#xff08;二进制方式安装&#xff09;&#xff1a; sudo apt-get install ros-humble-turtle-tf2-py ros-humble-tf2-tools ros-humble-tf-transformations 安装方式2&#xff08;克…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...