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

【数据结构与算法】十大经典排序算法-选择排序

🌟个人博客:www.hellocode.top
🏰Java知识导航:Java-Navigate
🔥CSDN:HelloCode.
🌞知乎:HelloCode
🌴掘金:HelloCode
⚡如有问题,欢迎指正,一起学习~~


选择排序是一种简单但低效的排序算法,其基本思想是每次从待排序序列中选出最小(或最大)的元素,然后将其放置在已排序序列的末尾(或开头)。通过逐步选择出最小(或最大)元素,将其插入到已排序序列中,从而逐步构建有序序列。

基本思想

  1. 将数组分为已排序区和未排序区。
  2. 在未排序区中找到最小(或最大)的元素。
  3. 将找到的最小(或最大)元素与未排序区的第一个元素交换位置,将该元素放入已排序区。
  4. 重复步骤 2 和 3,直到未排序区为空。

和插入排序很像,区别就在于选择和插入,根据动画体会一下,选择排序的重点是选择出未排序中最小(大)的,不断的加入到已排序区中(选择对的元素插入已排序区末尾)

代码实现

代码和插入排序可以对比着来写,也很简单,两层for循环,外层用来控制已排序的元素个数(选择好的待排序元素该放入的位置),内层for用来遍历选择出最小(大)的元素,具体代码如下:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月09日 21:21*/
public class SelectionSort {public static void main(String[] args) {int[] arr = {2, 12, 42, 13, 43, 85, 91, 23, 12, 4, 5, 8, 1, 9, 88, 66, 33, 123};System.out.println("排序前:"+ Arrays.toString(arr));selectionSort(arr);System.out.println("排序后:"+ Arrays.toString(arr));}public static void selectionSort(int[] arr){// 两层for循环,外层i代表已排序的元素个数for(int i = 0; i < arr.length - 1; i++){// 内层 for 进行选择,在待排序的元素中选择最小的进行排序int min = i;for(int j = i + 1; j < arr.length; j++){if(arr[j] < arr[min]){// j更小,更新minmin = j;}}// 将选择出的最小元素插入已排序元素中int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}
}

测试:

排序前:[2, 12, 42, 13, 43, 85, 91, 23, 12, 4, 5, 8, 1, 9, 88, 66, 33, 123]
排序后:[1, 2, 4, 5, 8, 9, 12, 12, 13, 23, 33, 42, 43, 66, 85, 88, 91, 123]

优化

虽然选择排序的时间复杂度不容易通过优化得到显著的提升,但一些小优化可以改善算法的实际性能。

  • 可以在内层循环中同时找到最小和最大元素,从而减少交换的次数。
  • 可以在选择最小(大)元素时采用不同的方法来代替逐个遍历,提高效率。

总结

优点

  1. 简单易懂:选择排序是一种简单直观的排序算法,易于实现。
  2. 稳定性:在相等元素的情况下,选择排序是一种稳定的排序算法。

缺点

  1. 低效性:选择排序的时间复杂度为 O(n^2),即使在最佳情况下也需要进行多次比较和交换,效率较低。
  2. 不适合大规模数据:由于时间复杂度的限制,选择排序不适合对大规模数据进行排序。

复杂度

  • 时间复杂度
    • 平均时间复杂度:O(n^2)
    • 最好情况时间复杂度:O(n^2)
    • 最坏情况时间复杂度:O(n^2)
  • 空间复杂度:原地排序,空间复杂度为 O(1)。

使用场景

由于其低效性,选择排序在实际应用中较少使用。在需要排序的数据规模较小时,选择排序可能是一个合理的选择。然而,对于大规模数据,其他高效的排序算法(如快速排序、归并排序)通常更为适用。选择排序适用于教学和学习排序算法的基本原理,但在实际应用中,通常会选择更优的排序算法。

当使用选择排序时,应特别注意其时间和空间复杂度的说明是基于固定的数据集。在实际情况中,选择排序的性能可能因为一些特定因素而有所不同,因此在特定情况下选择排序可能表现更好。

相关文章:

【数据结构与算法】十大经典排序算法-选择排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…...

【Spring专题】Spring之Bean的生命周期源码解析——阶段一(扫描生成BeanDefinition)

目录 前言阅读准备阅读指引阅读建议 课程内容一、生成BeanDefinition1.1 简单回顾*1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 ClassPathBeanDefinitionScanner#scan2.2 ClassPathBeanDefinitionScanner#doScan2.3 ClassPathScanningCandidateComponentProvider#findCandid…...

【C#】判断打印机共享状态

打印机共享状态 /// <summary>/// 打印机共享状态/// </summary>public enum PrinterShareState{/// <summary>/// 无打印机/// </summary>None -1,/// <summary>/// 未共享/// </summary>NotShare 0,/// <summary>/// 已共享/// …...

运维监控学习笔记7

Zabbix的安装&#xff1a; 1、基础环境准备&#xff1a; 安装zabbix的yum源&#xff0c;阿里的yum源提供了zabbix3.0。 rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 这个文件就是生成了一个zabbix.repo 2、安…...

【业务功能篇64】maven加速 配置settings.xml文件 镜像

maven加速 添加阿里镜像仓 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additi…...

Spring Boot(六十四):SpringBoot集成Gzip压缩数据

1 实现思路 2 实现 2.1 创建springboot项目 2.2 编写一个接口,功能很简单就是传入一个Json对象并返回 package com.example.demo.controller;import com.example.demo.entity.Advertising; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframewo…...

Mac安装opencv后无法导入cv2的解决方法

前提条件&#xff1a;以下两个插件安装成功 pip install opencv-python pip install --user opencv-contrib-python 注&#xff1a;直接用pip install opencv-contrib-python如果报错&#xff0c;就加上“–user" 第一步&#xff1a; 设置–添加python解释器 第二步&am…...

【题解】按之字形顺序打印二叉树

按之字形顺序打印二叉树 题目链接&#xff1a;按之字形顺序打印二叉树 解题思路&#xff1a;层次遍历&#xff0c;借助队列 首先解决如何模仿之字形的问题&#xff0c;我们为此设置一个flag&#xff0c;每到一层就修改flag&#xff0c;如果flag为true&#xff08;初始为fals…...

后端人员如何快速上手vue

一、环境搭建 了解更多vue-cli 官网地址:https://cli.vuejs.org/zh/guide/browser-compatibility.html 前提 1.安装node(js代码的运行环境)、npm、cnpm/yarn&#xff1b; nodejs官网&#xff1a;https://nodejs.org/en cnpm安装&#xff1a;https://www.python100.com/htm…...

基于Prometheus监控Kubernetes集群

目录 一、环境准备 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master节点 2.6、安装node节点 2.7、安装flannel、cni 2.8、部署测…...

【数据分析】pandas (三)

基本功能 在这里&#xff0c;我们将讨论pandas数据结构中常见的许多基本功能 让我们创建一些示例对象&#xff1a; index pd.date_range(“1/1/2000”, periods8) s pd.Series(np.random.randn(5), index[“a”, “b”, “c”, “d”, “e”]). df pd.DataFrame(np.random.…...

nvm命令

1. 常见命令 1. nvm -v //查看nvm版本 nvm --version &#xff1a;显示 nvm 版本 2. nvm list //显示版本列表 nvm list &#xff1a;显示已安装的版本&#xff08;同 nvm list installednvm list installed&#xff1a;显示已安装的版本nvm list available&#xff1a;显示所有…...

从此已是义无反顾

距离上次发这个专栏的文章已经过去了十多天&#xff0c;现在我已经开始准备面试内容&#xff0c;迟迟还没有投出第一份简历&#xff0c;只是因为我感觉对知识点的理解还不到位&#xff0c;于是开始一边看JavaGuide老师总结的面试题目&#xff0c;一边翻看以前学习的笔记&#x…...

Element组件浅尝辄止2:Card卡片组件

根据官方说法&#xff1a; 将信息聚合在卡片容器中展示。 1.啥时候使用&#xff1f;When? 既然是信息聚合的容器&#xff0c;那场景就好说了 新建页面时可以用来当做页面容器页面的某一部分&#xff0c;可以用来当做子容器 2.怎样使用&#xff1f;How&#xff1f; //Card …...

“深入剖析Java多态:点燃编程世界火花“

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:“继承与组合&#xff1a;代码复用的两种策略“&#x1f649; &#x1f439;今日诗词:马踏祁连山河动,兵起玄黄奈何天&#x1f439; 快去学习 &#x1f338;思维导…...

golang官方限流器rate包实践

日常开发中&#xff0c;对于某些接口有请求频率的限制。比如登录的接口、发送短信的接口、秒杀商品的接口等等。 官方的golang.org/x/time/rate包中实现了令牌桶的算法。 封装限流器可以将ip、手机号这种的作为限流器组的标识。 接下来就是实例化限流器和获取令牌函数的实现…...

[windows]MAT- 下载及安装

1. 下载安装包 1.1MAT下载链接&#xff1a; https://pan.baidu.com/s/1sUWPITSto8MjOrcF0BsJQg?pwd1111 提取码&#xff1a;1111 1.2MAT需要jdk17版本及以上支持&#xff0c;下载链接: https://pan.baidu.com/s/111jz90S4tie_48lQeExcZg?pwd1111 提取码&#xff1a;1…...

数组模拟环形队列详解

数组模拟环形队列 实现逻辑 创建一个固定大小的数组作为队列的存储空间&#xff0c;同时定义队列的头部和尾部指针&#xff08;front和rear&#xff09;。初始时&#xff0c;将头部和尾部指针都设置为0&#xff0c;表示队列为空。入队操作&#xff08;enqueue&#xff09;&am…...

《论文阅读12》RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds

一、论文 研究领域&#xff1a;全监督3D语义分割&#xff08;室内&#xff0c;室外RGB&#xff0c;kitti&#xff09;论文&#xff1a;RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds CVPR 2020 牛津大学、中山大学、国防科技大学 论文链接论文gi…...

elementPlus使用el-icon

安装 # NPM $ npm install element-plus/icons-vue # Yarn $ yarn add element-plus/icons-vue # pnpm $ pnpm install element-plus/icons-vue一、main.ts&#xff08;全局注册&#xff09; import * as ElementIcons from element-plus/icons-vuefor (const key in Element…...

预测知识 | 神经网络、机器学习、深度学习

预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价神经网络机器学习深度学习参考资料 神经网络 神经网络&#xff08;neural network&#xff09;是机器学习的一个重要分支&#xff0c;也是深度学习的核心算法。神经网络的名字和结构&#xff0c;源自…...

【Linux】进程的基本属性|父子进程关系

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;Linux仓库 个人专栏&#xff1a;Linux专栏 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处 文章目录 前言进程属性1.进程PID和PPID2.fork函数创建子进程1&#xff09;为什…...

CCF考试:201809-1 卖菜(java代码)

目录 1、【问题描述】 2、【思路分析】 3、【代码区】 1、【问题描述】 在一条街上有n个卖菜的商店&#xff0c;按1至n的顺序排成一排&#xff0c;这些商店都卖一种蔬菜。   第一天&#xff0c;每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致&#xf…...

android wifi扫描 framework层修改扫描间隔

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ScanRequestProxy.java 这个也就是说前台应用可以在120s(2分钟) 扫描 4 次 * a) Each foreground app can request a max of* {link #SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS} scan every* {l…...

webstorm debug调试vue项目

1.运行npm&#xff0c;然后控制台会打印下图中的地址&#xff0c;复制local的地址 2.run–>Edit Configuration&#xff0c;如下图 3.设置测试项 4.在你需要的js段打好断点 5.在上边框的工具栏里面有debug运行&#xff0c;点击debug运行的图标运行即可...

嵌入式linux的八股文之旅 DAY1

1 三次握手 四次挥手 服务端 先从close到listen 然后第一个syn报文 客户端 生成初始序列号 client_isn &#xff08;就是iternal sequence number 初始序列号&#xff09; 然后放到TCP首部的序列号端里 然后把SYN标志位置一 然后发送给服务器端 之后处于SYN-SENT状态 服务器…...

同创永益郑阳|与数智化共舞·业务稳定性保障新动力

2023年8月2日&#xff0c;由北大创新评论主办的2023 Inno China中国产业创新大会-保险产业创新论坛在京举办。本次论坛由同创永益、青牛软件、DaoCloud道客联合主办&#xff0c;INNO创新家、产业集群发展提供战略支持&#xff0c;未名数创承办&#xff0c;邀请到了学术专家、行…...

史上最全的Qt控件

本软件是收费工具&#xff0c;学生党勿扰&#xff0c;闹眼子党勿扰&#xff0c;白嫖党勿扰 收费金额&#xff1a;1000元 1 概述 经过这两年的编写&#xff0c;写不少控件&#xff0c;甚至把刘某某90%的控件都绘制了一遍。当然后还有一些其他刘某没有控件。 2 功能 借用刘某博…...

星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)

#AIGC技术内容创作征文&#xff5c;全网寻找AI创作者&#xff0c;快来释放你的创作潜能吧&#xff01;# 文章目录 1 前言2 测试详情2.1 文案写作2.2 知识写作2.3 阅读理解2.4 语意测试&#xff08;重点关注&#xff09;2.5 常识性测试&#xff08;重点关注&#xff09;2.6 代码…...

传输控制协议TCP

目录 TCP报文格式 TCP的特点 TCP原理: 1.确认应答机制 2.超时重传机制 3.连接管理机制 建立连接 ​编辑关闭连接 4.滑动窗口机制 ​5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答 TCP报文格式 1.源端口号:发送端的哪一个端口发出的 2.目的端口号:接收端的哪一个端…...