详解十大经典排序算法(二):选择排序(Selection Sort)

Java排序算法——选择排序(Selection Sort) 上次总结了一下冒泡排序,这次来看看同样非常简单的选择排序 上期冒泡排序传送门: Java排序算法——冒泡排序(Bubble Sort)https://blog.youkuaiyun.com/babbfqb93/article/details/123005968?spm=1001.2014.3001.5501 选择排序(Selection Sort)就是通过选择一个数组中的最大(小)值排序到数组的头部位置(和头部位置交换)接下来循环剩余数组找到次最大(小)值排序到第二的位置,以此类推,直到所有的数字都被选择完成之后 阅读详情

算法原理

选择排序通过重复选择数组中最小元素,将其与未排序部分的第一个元素交换,实现排序。

算法描述

选择排序是一种简单的排序算法,它每次从待排序的元素中选择最小(或最大)的元素,将其放到已排序序列的末尾,直到整个序列排序完成。
选择排序的基本思想是通过不断选择剩余元素中的最小(或最大)元素,将其放置到已排序序列的末尾,从而逐步构建有序序列。具体步骤如下:

  1. 遍历待排序序列,找到最小(或最大)的元素。
  2. 将最小(或最大)元素与待排序序列的第一个元素交换位置,将该元素放置到已排序序列的末尾。
  3. 缩小待排序序列的范围,将已排序序列的长度增加1。
  4. 重复步骤1-3,直到待排序序列为空。

动画演示

在这里插入图片描述

代码实现

public void selectSort(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;
                }
            }
            //交换 arr[i]和arr[minIndex]
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

算法复杂度

时间复杂度(最坏)时间复杂度(最好)时间复杂度(平均)空间复杂度稳定性
O(n^2)O(n^2)O(n^2)O(1)不稳定

选择排序的优化方式:

  1. 设置一个标志位,记录每一趟遍历中最小(或最大)元素的位置,避免不必要的交换操作。
public 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;
                }
            }
            if (minIndex != i) {
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
    }
  1. 使用双指针,分别指向已排序序列的末尾和待排序序列的开头,减少交换操作的次数。
public void selectionSort(int[] arr) {
        int n = arr.length;
        int left = 0;
        int right = n - 1;
    
        //直到left和right指针相遇。
        while (left < right) {
            int minIndex = left;
            int maxIndex = left;
            //寻找最小和最大元素下标
            for (int i = left + 1; i <= right; i++) {
                if (arr[i] < arr[minIndex]) {
                    minIndex = i;
                }
                if (arr[i] > arr[maxIndex]) {
                    maxIndex = i;
                }
            }
            //如果最小元素的位置不等于left,则将最小元素与已排序序列的末尾元素交换位置。
            //此处的末尾是数值越来越大:1 3 4 ...
            if (minIndex != left) {
                int temp = arr[left];
                arr[left] = arr[minIndex];
                arr[minIndex] = temp;
            }
            //如果最大元素的位置等于left,则将最大元素的位置更新为最小元素的位置。
            //因为上一步已经把最大元素换到了最小元素位置,所以需要重新设置下标
            if (maxIndex == left) {
                maxIndex = minIndex;
            }
            //如果最大元素的位置不等于right,则将最大元素与待排序序列的开头元素交换位置。
            //此处的开头是数值越来越小:... 5 6 9
            if (maxIndex != right) {
                int temp = arr[right];
                arr[right] = arr[maxIndex];
                arr[maxIndex] = temp;
            }
            left++;
            right--;
        }
    }

通过使用双指针的优化方式,可以减少交换操作的次数。在每一趟遍历中,同时找到最小元素和最大元素的位置,并根据情况进行交换操作。这样可以减少不必要的交换操作,提高排序的效率。同时,由于每一趟遍历中的交换操作次数减少,也减少了数据的移动次数,进一步提高了排序的效率。


相关概念
• 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
• 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
• 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
• 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

排序算法——选择排序 Selection Sort(C Java) 选择排序(Selection Sort)是一种非常简单的排序算法,它将待排序序列划分成两部分:已排序部分和待排序部分。起始时,已排序部分为空,待排序部分为整个输入序列。算法会不断的遍历待排序部分,找出最小的(或最大的)元素,与待排序序列的最左边的元素交换,交换后,把左边的那个元素归入已排序部分。因为每次总是从待排序部分中选择最小(大)的元素,然后归入已排序部分的末尾,所以最终会得到输入序列的一个完整有序序列。 例如对输入数组arr[]=64 25 12 22 11,应用选择排序算法过程如下 arr[] 阅读详情

相关推荐

C/C++ Selection Sort选择排序算法详解及源码

Selection Sort的优点是实现简单,无论数据量多少,算法的时间复杂度都为O(n^2),稳定性不受影响。在小规模数据排序时,相比其他复杂的排序算法(如快速排序、归并排序),Selection Sort的性能相对较好。Selection Sort(选择排序)是一种简单的排序算法。它的基本思想是将待排序的序列分为已排序区和未排序区,每次从未排序区选择最小(或最大)的元素,放到已排序区的末尾,直到全部元素排序完成。此外,由于其时间复杂度为O(n^2),在大规模数据排序时,效率较低。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 7746

十大经典排序算法之冒泡排序(Bubble Sort)、选择排序(Selection Sort)

十大排序算法 冒泡、选择、插入、归并、快速、希尔、堆排序,属于比较排序(Comparison Sorting) 冒泡排序(Bubble Sort) 冒泡排序也叫做起泡排序 执行流程 ①、从头开始比较每一对相邻元素,如果第一个比第二个大,就交换它们的位置。 执行完一轮后,最末尾那个元素就是最大的元素。 ②、忽略①中曾经找到的最大元素,重复执行步骤①、直到全部元素有序。

派拉斯兔子的博客 2158

Python selection sort选择排序算法详解及源码

选择排序(Selection Sort)是一种简单的排序算法,首先在未排序的序列中找到最小(或最大)元素,将其放在序列的起始位置。然后,在剩余未排序的序列中找到最小(或最大)元素,放在已排序序列的末尾。重复这个过程,直到整个序列排序完成。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1010

排序算法(2)选择排序(Selection Sort)

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 2.1 算法描述 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下: 初始状态:无序区为R[1…n],有序区为空...

cowbin2012的专栏 1万+

C/C++ Cocktail Selection Sort鸡尾酒选择排序算法详解及源码

Cocktail Selection Sort,也被称为鸡尾酒选择排序,是一种改进版的选择排序算法。它的原理是在排序过程中,不仅仅从左到右依次找到最小值,也会从右到左依次找到最大值。这种双向的选择排序算法可以更好地优化已经接近有序的数组。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 7890

十大经典排序算法简介

本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。1)稳定:归并、冒泡、插入、计数、桶、基数。2)非比较排序(计数/桶/基数)空间换时间。4)稳定需求:归并排序(大数据)或基数排序(整数)时间:O(n \times k)(k为最大位数)时间:O(n\log n)(最坏O(n^2))8. 计数排序 (COUNTING SORT)时间:O(n^{1.3})(依赖增量序列)2)不稳定:选择、希尔、快速、堆。1)归并排序需要额外O(n)空间。

kupePoem的专栏 1801

十大经典排序算法(二)选择排序(Selection Sort)

十大经典排序算法(二)选择排序 算法描述 首先在未排序序列中找到最小元素,存放到排序序列的起始位置. 然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。 以此类推,直到所有元素均排序完毕。 动图演示 代码实现 找到最小值的索引。 把第 i 次循环的 i 上的值和最小值交换。 public class A2SelectionSort { public static void main(String[] args) { int[] array = {3,44,3

qq_40205337的博客 211

静态与动态LACP链路聚合:原理、配置与排错实战指南

链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解

weixin_31412781的博客 268

详解Java经典算法之选择排序——Selection Sort

Java经典算法之选择排序——Selection Sort 排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等。插入排序,堆排序,选择排序,归并排序,快速排序和冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息。—— [ 百度百科 ] 什么是选择排...

小鲨鱼的博客 1507

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 483

学习笔记:CNN中模型复杂度

CNN有卷积层和全连接层构成。对于一个卷积层,设输入通道数未CinC_{in}Cin​,输出通道数未CoutC_{out}Cout​,卷积核kernel size为Kw×KhK_w\times K_hKw​×Kh​,输出的特征图尺寸是H×WH\times WH×W 。全连接层的输入通道数为NinN_{in}Nin​,输出通道数为NoutN_{out}Nout​. 时间复杂度 用每秒钟浮点数运算量衡量。 FLOPs指的是floating-point operations per second,每秒钟浮点数运算

keep用心的博客 623

十大经典排序算法

转载自:十大经典排序算法(动图演示) 目录 0、算法概述 1、冒泡排序(Bubble Sort) 2、选择排序(Selection Sort) 3、插入排序(Insertion Sort) 4、希尔排序(Shell Sort) 5、归并排序(Merge Sort) 6、快速排序(Quick Sort) 7、堆排序(Heap Sort) 8、计数排序(Counting Sort)...

攸的博客 418

基于Java的高校学生信息管理系统的设计与实现(论文+源码)

可以对本系统的数据进行良好的封装,Java可以对不想被访问的数据进行良好的隐藏,具备平台无关性,可移植,更加可靠与安全,具备多线程支持,进行网络交互更容易。它支持本系统的B/S模式。开发效益方面,本系统一旦开发成功并且面向社会,就会让大多数的学生教师体会到便利办公的乐趣,随之促进提高本系统的使用率和经济利润,所以在经济方面,对于零成本开发且高利润的学生管理系统是可行的。学生可以在学生端进行选课,查看自己的成绩,教师可以在教师端查看所任课程的选课情况,对学生成绩进行录入,对所任的课程进行结课等操作。

2402_82389843的博客 1092

选择排序算法(selection sort algorithm)

**插入排序**:对于已经有序的数据,插入排序只需要进行 \(O(n)\) 次比较和交换操作,表现出线性时间复杂度 \(O(n)\),这是因为插入排序可以在遇到有序数据时提前终止内层循环。2. **第二步**:在剩下的数字 [3, 8, 6, 5] 中找到最小的数字是 3,把 3 放到 2 后面。现在我们有 [2, 3, 8, 6, 5]。1. **固定的比较次数**:选择排序总是进行固定次数的比较操作,即使输入数据已经有序,它仍然需要进行 \(\frac{n(n-1)}{2}\) 次比较。

cocofu的博客 943

基于AIS动态数据与AI结合得经纬度标示算法

港口船舶智能标注系统 本系统通过结合摄像头视频流和AIS船舶动态数据,利用AI技术实现船舶实时标注功能。系统架构包括视频流处理、AIS数据解析、船舶检测匹配和坐标映射转换等模块。关键技术步骤: AIS数据获取:通过本地接收机或网络API获取船舶位置、航速等信息 AI目标检测:采用YOLOv8等模型识别视频中的船舶 船舶匹配算法:通过位置投影或运动轨迹匹配视频目标与AIS数据 坐标映射:使用相机标定技术将经纬度转换为图像坐标 实时标注:在视频画面上叠加船名、位置等关键信息 应用场景包括港口监控、智能海事管理和

qianbo042311的博客 1808

SPAD IMX479规格_分辨率

当然IMX479具备IMX459几乎全部的数字架构,但也有一个缺点就是贵,这个让头部的主机厂有些犹豫,毕竟大家都在集中火力想把车载LiDAR玩进千元机。如果用一片IMX479是不太可能实现千元内部的,当然国产也在奋起直追,特别在前面的几家SPAD厂商都具备开发IMX479的实力,但相对来说落地可能更是当下所考虑的,IMX479的迭代是基于IMX459,小编已经注意到国内有一两家已经在挑战479的规格了,如果国产SPAD没有大规模量产就直接流片IMX479的规格,可能就有点忽略市场的反馈闭环。

致力于lidar应用开发 2416

简单排序算法--选择排序(Selection Sort)

1.选择排序算法含义 表现最稳定的排序算法之一,因为无论什么数据进去都是o(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。 选择排序是一种简单直观的排序算法。它的工作原理:首先在未排序的序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 ...

dfBeautifulLive的博客 1555

第78篇:AI辅助创意与设计工作流——Logo、海报、UI的自动化生成与迭代(操作教程)

在广告公司和设计团队摸爬滚打几年,我见过太多设计师为一个Logo的配色、一张海报的版式反复修改到深夜。自从AI绘画工具爆发,我就一直在琢磨,怎么把这些“黑科技”真正塞进设计师的日常流水线里,而不是让它们仅仅是个玩具。今天要聊的,就是一套我实践下来,能真正提升效率的AI辅助创意与设计工作流。我们不谈颠覆,只谈增效——如何用AI快速完成Logo、海报、UI的灵感生成、批量出图与智能迭代,把设计师从重复劳动中解放出来,聚焦在真正的创意决策上。

weixin_37464284的博客 538

十大排序算法--选择排序(Selection Sort)

选择排序(Selection Sort) 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。 C++实现 #include <iostream&gt...

向日葵的博客 377

大模型技术全景与核心概念解析:从基础原理到AI智能体架构(实时更新中)

本文系统解析了大模型技术的核心概念与架构。首先介绍了LLM(大语言模型)、LLMOps(模型运维)、AIGC(生成内容)、AGI(通用AI)等基础概念,重点阐述了大模型的工作原理,包括预处理、推理和后处理三个阶段。深入讲解了Token分词、FLOPs计算、Embedding向量表示等关键技术,并分析了LoRA微调、MoE架构等前沿方法。文章还探讨了AI智能体的发展前景,为理解大模型技术提供了全景视角。

算法工程师 1233

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c语言用sort函数选择排序,简单选择排序(Simple Selection Sort)的C语言实现

简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后演示实例:C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp)原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia#include #define LEN 6typedef float keyType;typedef str...

weixin_35417884的博客 1455

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

十大经典排序算法——选择排序(Selection Sort)

文章目录算法代码1代码1-2 优化 算法 (1)算法基本思想是每一次选择出所有元素中最小(大)元素到第1,2,3…n个位置上; (2)每次的选择都是简单遍历; (3)时间复杂度也是O(n^2) 代码1 (1)index的存在意义没有了!可以直接将index换成i public int[] select(int[] arr){ int len = arr.length; ...

Heorin X的博客 256

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python 实现·十大排序算法之选择排序(Selection Sort)

文章目录简介算法实现步骤Python 代码实现动画演示算法分析联系我们 简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完成。 算法实现步骤 初始状态:无序区为R[1,⋯ ,n]R\left[ 1,\cdots ,n \right]R[1,⋯,n],有序区为空; 第i趟排序(i=1,2,3,⋯ ,

南风以南 463

选择排序(Selection Sort)-- 初级排序算法

1 选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 算法描述 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下: 初始状态:无序区为R[1…n],有序区为空; 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R

OuDiShenmiss的博客 467

排序算法总结之选择排序 Selection Sort

算法原理: 选择排序的思想是首先找到数组中最小的元素放在首位,然后依次找到第二小,第三小元素直到整个数组有序。 选择排序是冒泡排序的一种改进,冒泡排序在找当前最小元素的过程中只要遇到小的就交换,而选择排序直接找到最小的元素并放在相应的位置,省去了中间的多次交换。 算法伪代码: SELECTION-SORT(A) n = length[A] for j=1 t n-1 do sma

fight to dead的博客 526
上一篇: 详解十大经典排序算法(一):冒泡排序(Bubble Sort)
下一篇: 详解十大经典排序算法(三):插入排序(Insertion Sort)
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值