java 选择排序,涵盖工作原理、算法分析、实现细节、优缺点以及一些实际应用场景

选择排序的详细解析

更深入地探讨选择排序的各个方面,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。

动画演示
在这里插入图片描述

1. 基本概念

选择排序是一种简单的比较排序算法。它的核心思想是将数组分为两个部分:已排序部分和未排序部分。每一轮从未排序部分找到最小(或最大)元素,并将其放到已排序部分的末尾。

2. 工作原理
  • 初始化:整个数组都被视为未排序部分。
  • 迭代过程
    • 从未排序部分中选出最小元素。
    • 将最小元素与未排序部分的第一个元素交换。
    • 已排序部分增加一个元素,未排序部分减少一个元素。
3. 详细步骤

考虑一个数组 arr,假设其长度为 n

  1. 第 1 轮

    • arr[0]arr[n-1] 中找最小值,假设找到的最小值在位置 minIndex
    • 交换 arr[0]arr[minIndex]
    • 已排序部分:[arr[0]],未排序部分:[arr[1], arr[2], ..., arr[n-1]]
  2. 第 2 轮

    • arr[1]arr[n-1] 中找最小值,假设找到的最小值在位置 minIndex
    • 交换 arr[1]arr[minIndex]
    • 已排序部分:[arr[0], arr[1]],未排序部分:[arr[2], ..., arr[n-1]]
  3. 继续:重复以上过程,直到未排序部分为空。

4. 伪代码
function selectionSort(array):n = length(array)for i from 0 to n - 1:minIndex = ifor j from i + 1 to n - 1:if array[j] < array[minIndex]:minIndex = jif minIndex != i:swap(array[i], array[minIndex])
5. Java 实现
public class SelectionSort {public static void selectionSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {int minIndex = i; // 假设当前元素为最小值for (int j = i + 1; j < n; j++) {if (array[j] < array[minIndex]) {minIndex = j; // 更新最小值的索引}}// 如果最小值的索引变化了,则交换if (minIndex != i) {swap(array, i, minIndex);}}}// 交换数组中两个元素的方法private static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}// 测试选择排序public static void main(String[] args) {int[] array = {64, 25, 12, 22, 11};selectionSort(array);System.out.println("排序后的数组:");for (int num : array) {System.out.print(num + " ");}}
}
6. 复杂度分析
  • 时间复杂度

    • 最坏情况:(O(n^2)),每次外层循环运行 n - 1 次,内层循环运行的次数依次为 n - 1, n - 2, …, 1。
    • 最好情况:(O(n^2)),无论数组是正序还是逆序,选择排序的比较次数都是固定的。
    • 平均情况:(O(n^2))。
  • 空间复杂度:选择排序是原地排序,额外空间复杂度为 (O(1))。

7. 稳定性

选择排序是一种不稳定的排序算法。原因在于,当算法寻找最小值并交换时,相同值的元素可能会改变相对位置。例如,如果有两个相同的元素,后一个可能会被前一个覆盖。

8. 优缺点

优点

  • 实现简单,容易理解。
  • 不需要额外的存储空间,适合内存受限的环境。

缺点

  • 时间复杂度高,适合小规模数据排序。
  • 不稳定排序,可能改变相同元素的相对顺序。
9. 实际应用

选择排序在实际应用中并不常用,因其效率较低。然而,它在以下情况中仍然有一定的应用价值:

  • 小规模数据排序:当数据量较小时,选择排序的简单性可以使其成为一种合适的选择。
  • 教学目的:选择排序常用于教学,以帮助学生理解排序算法的基本原理。
10. 总结

选择排序是一种基础的排序算法,适合用于小规模数据的排序。尽管它的效率不如快速排序、归并排序等高级算法,但其简单性和易于实现的特性仍然让它在一些场合下具有使用价值。理解选择排序的工作原理,为学习更复杂的排序算法奠定了基础。

更多资源推荐:
http://sj.ysok.net/jydoraemon 提取码:JYAM

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

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

相关文章

矩阵-向量乘法的行与列的解释(Row and Column Interpretations):中英双语

本文是学习这本书的笔记 网站是&#xff1a;https://web.stanford.edu/~boyd/vmls/ 矩阵-向量乘法的行与列的解释 矩阵-向量乘法&#xff08;Matrix-Vector Multiplication&#xff09;是线性代数中的基本操作&#xff0c;也是机器学习、数据科学和工程中常用的数学工具。本文…

【Vulkan入门】18-Texture[2/4]

文章目录 TextureTexture::LoadImage() 本篇不叨叨了&#xff0c;接着 上篇。 本篇介绍如何创建纹理图片。 Texture 这个类的作用是传入一个图片的路径&#xff0c;构建纹理图片和Sampler。 Texture::LoadImage() 这个方法是创建纹理Image 代码比较长&#xff0c;我先把代码…

MFC 应用程序语言切换

在开发多语言支持的 MFC 应用程序时&#xff0c;如何实现动态语言切换是一个常见的问题。在本文中&#xff0c;我们将介绍两种实现语言切换的方式&#xff0c;并讨论其优缺点。同时&#xff0c;我们还会介绍如何通过保存配置文件来记住用户的语言选择&#xff0c;以及如何在程序…

torch.multiprocessing 向Process传递对象参数报错 Can‘t pickle local object

如下代码所示&#xff0c;使用torch.multiprocessing启动多进程&#xff0c;并传递了model和image_processor两个对象作为参数。 from torch.multiprocessing import Process, Queue, Manager...p3 Process(targetframe_memory_manager,args(model, image_processor, frame_q…

基于海思soc的智能产品开发(巧用mcu芯片)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说&#xff0c;socmcu这样的组合&#xff0c;他们并不陌生。但是传统的工业领域&#xff0c;比如发动机、医疗或…

带有 Elasticsearch 和 Langchain 的 Agentic RAG

作者&#xff1a;来自 Elastic Han Xiang Choong 讨论并实现 Elastic RAG 的代理流程&#xff0c;其中 LLM 选择调用 Elastic KB。 更多阅读&#xff1a;Elasticsearch&#xff1a;基于 Langchain 的 Elasticsearch Agent 对文档的搜索。 简介 代理是将 LLM 应用于实际用例的…

SmartX分享:NVMe-oF 介绍、SMTX ZBS 如何选择高性能场景解决方案与如何实现

目录 背景什么是 NVMe-oFZBS AccessiSCSI 与 iSERNMVe-oF 介绍NVMeNVMe-oFNVMe-oF 承载网络&#xff08;数据平面&#xff09; ZBS NVMe-oF 实现ZBS 接入策略ZBS 接入点分配策略性能测试 为什么要支持 RoCE引用 背景 前几篇文章&#xff0c;我们认识到了 SmartX 公司产品 SMTX…

单片机flash rom ram 理解

您说得对&#xff0c;传统意义上的 ROM&#xff08;Read-Only Memory&#xff0c; 只读存储器&#xff09; 是一种非易失性存储器&#xff0c;掉电后不会丢失数据。但在很多单片机&#xff08;例如STM8&#xff09;中&#xff0c;所谓的 EEPROM 或 Flash 也常被称作“ROM”来存…

全面解析 Golang Gin 框架

1. 引言 在现代 Web 开发中&#xff0c;随着需求日益增加&#xff0c;开发者需要选择合适的工具来高效地构建应用程序。对于 Go 语言&#xff08;Golang&#xff09;开发者来说&#xff0c;Gin 是一个备受青睐的 Web 框架。它轻量、性能高、易于使用&#xff0c;并且具备丰富的…

【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种基于试错的方法&#xff0c;旨在通过智能体与环境的交互&#xff0c;学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体&#xff08;Agent&#xff09; 执行动作并与环境…

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#x…

Spring Boot 项目创建

创建一个新项目&#xff1a; 打开 Spring Initializr 网址&#xff1a;https://start.spring.io/ &#xff0c;然后创建一个新项目&#xff1a; springboot3.3.5_jdk17&#xff1a; Project&#xff08;Maven&#xff09;编程语言&#xff08;Java 17&#xff09;Spring Boo…

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮&#xff0c;本次基于蓝牙通信的手机遥控智能灯设计功能如下&#xff1a; &#xff08;1&#xff09;用户可以通过蓝牙通信模块的作用下&#xff0c;在手机端遥控切换智能灯不同的工作模式&#xff1b; &#x…

【VUE】13、安装nrm管理多个npm源

nrm&#xff08;npm registry manager&#xff09;是一个 npm 源管理器&#xff0c;它允许用户快速地在不同的 npm 源之间进行切换&#xff0c;以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍&#xff1a; 1、安装nrm 在使用 nrm 之前&#xff0c;需要先确保已经安装…

ASR-LLM-TTS 实时语音对话助手:语音识别、大模型对话、声音生成

参考:https://blog.csdn.net/weixin_42357472/article/details/137020794 asr:funasr-SenseVoiceSmall 离线 llm:deepseek 在线api tts:edge-tts 在线api import pyaudio import wave import threading import numpy as np import time from queue import Queue import web…

为什么光耦固态继电器(SSR)值得关注?

光耦固态继电器&#xff08;SSR&#xff09;作为现代电子控制系统中不可或缺的关键组件&#xff0c;正逐步取代传统机械继电器。通过利用光耦合技术&#xff0c;SSR不仅能够提供更高的可靠性&#xff0c;还能适应更加复杂和严苛的应用环境。在本文中&#xff0c;我们将深入探讨…

AI @国际象棋世界冠军赛: 从棋盘到科研创新之路

点击屏末 | 阅读原文 | 在小红书和 Google 谷歌回顾 WCC

矩阵运算的复杂度分析(Complexity Analysis of Matrix Operations):中英双语

矩阵运算的复杂度分析 矩阵运算在科学计算、机器学习、图像处理等领域中起着至关重要的作用。了解各种常见矩阵运算的复杂度&#xff0c;对于优化算法、提高计算效率具有重要意义。在这篇博客中&#xff0c;我们将详细探讨矩阵加法、标量乘法、矩阵转置、矩阵-向量乘法等基本矩…

leetcode二叉搜索树部分笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 二叉搜索树 1. 二叉搜索树的最小绝对差2. 二叉搜索树中第 K 小的元素3. 验证二叉搜索树 1. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中…

如何创建属于自己的大语言模型:从零开始的指南

如何创建属于自己的大语言模型&#xff1a;从零开始的指南 为什么要创建自己的大语言模型&#xff1f; 随着人工智能的快速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各种场景中表现出了卓越的能力&#xff0c;例如文本生成、对话交互和内容总结等。虽然市场上…