排序 - 选择排序(Selection sort)

news2024/12/27 15:17:20

文章目录

  • 选择排序介绍
  • 选择排序实现
  • 选择排序的时间复杂度和稳定性
    • 选择排序时间复杂度
    • 选择排序稳定性
  • 代码实现
  • 核心&总结

每日一道算法,提高脑力。第四天,选择排序。

选择排序介绍

它的基本思想是:
首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序实现

下面以数列{20,40,30,10,60,50}为例,演示它的选择排序过程(如下图)。

在这里插入图片描述

排序流程

  • 第1趟: i=0。找出a[1…5]中的最小值a[3]=10,然后将a[0]和a[3]互换。 数列变化: 20,40,30,10,60,50 – > 10,40,30,20,60,50
  • 第2趟: i=1。找出a[2…5]中的最小值a[3]=20,然后将a[1]和a[3]互换。 数列变化: 10,40,30,20,60,50 – > 10,20,30,40,60,50
  • 第3趟: i=2。找出a[3…5]中的最小值,由于该最小值大于a[2],该趟不做任何处理。
  • 第4趟: i=3。找出a[4…5]中的最小值,由于该最小值大于a[3],该趟不做任何处理。
  • 第5趟: i=4。交换a[4]和a[5]的数据。 数列变化: 10,20,30,40,60,50 – > 10,20,30,40,50,60

选择排序的时间复杂度和稳定性

选择排序时间复杂度

选择排序的时间复杂度是O(N2)。

假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢? N-1!因此,选择排序的时间复杂度是O(N2)。

选择排序稳定性

选择排序的稳定性是有一些争议的,不过一般提到排序算法,往往默认是数组实现,所以通常认为选择排序是不稳定的。

  • 回顾:什么是排序算法的稳定性?

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

  • 数组实现和链表实现的差异

用数组实现的选择排序是不稳定的,用链表实现的选择排序是稳定的。不过,一般提到排序算法时,大家往往会默认是数组实现,所以选择排序是不稳定的。

  • 此外,排序算法的稳定性也是可以改变的,只是需要额外的时间和空间

有很多办法可以将任意排序算法变成稳定的,但是,往往需要额外的时间或者空间;而我们默认情况谈算法的稳定性是不考虑这种实现的。

代码实现


package com.zxn;

/**
 * @author zxn
 * @ClassName SelectSort
 * @Description
 * @createTime 2023年04月26日 20:33:00
 */
public class SelectSort {
    public static void main(String[] args) {
        int[] a = {20,40,30,10,60,50};
        System.out.print("排序后:");
        selectSort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
       
    }

    /**
     *
     * @param a 待排序数组
     */
    public static void selectSort(int[] a){
        int i;        // 有序区的末尾位置
        int j;        // 无序区的起始位置
        int min;    // 无序区中最小元素位置

        for(i=0; i<a.length; i++) {
            min=i;

            // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
            for(j=i+1; j<a.length; j++) {
                if(a[j] < a[min])
                    min=j;
            }

            // 若min!=i,则交换 a[i] 和 a[min]。
            // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
            if(min != i) {
                int tmp = a[i];
                a[i] = a[min];
                a[min] = tmp;
            }
        }
    }
}



排序后:
10
20
30
40
50
60

核心&总结

  • 第一次默认无已排序部分
  • 每次从待排序中找到最小值,然后放置在待排序数组开头,放置前比较是否需要换位置
  • 注意循环语句的终止条件和起始条件

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

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

相关文章

Shiro详解(超全面)

目录: 一、简介二、Shiro的整体架构1、Subject2、Security Manager3、Cryptography4、Authenticator5、Authorizer6、realm7、sessionManager8、SessionDAO9、CacheManager 三、入门案例四、认证流程1、认证流程2、常见异常 五、授权流程1、授权流程2、自定义realm实现授权 六、…

JavaScript日期库之date-fn.js

用官网的话来说&#xff0c;date-fn.js 就是一个现代 JavaScript 日期实用程序库&#xff0c;date-fns 为在浏览器和 Node.js 中操作 JavaScript 日期提供了最全面、但最简单和一致的工具集。那实际用起来像它说的那么神奇呢&#xff0c;下面就一起来看看吧。 安装 安装的话就…

深度学习 -- pytorch 计算图与动态图机制 autograd与逻辑回归模型

前言 pytorch中的动态图机制是pytorch这门框架的优势所在&#xff0c;阅读本篇博客可以使我们对动态图机制以及静态图机制有更直观的理解&#xff0c;同时在博客的后半部分有关于逻辑回归的知识点&#xff0c;并且使用pytorch中张量以及张量的自动求导进行构建逻辑回归模型。 …

Springboot 自动装配流程分析

目录 1.基础知识&#xff1a; 2.具体代码执行流程 3.流程总结&#xff1a; 4.参考文章&#xff1a; 1.基础知识&#xff1a; springboot的自动装配是利用了spring IOC容器创建过程中的增强功能&#xff0c;即BeanFactoryPostProcessor&#xff0c; 其中的ConfigurationCla…

【JavaEE】SpringBoot的日志

目录 日志作用 SpringBoot日志框架 日志打印 日志级别 类型 作用 修改级别 日志永久化 配置日志文件目录 配置日志文件名 简化日志打印和永久化——lombok 日志作用 问题定位&#xff1a;可以帮助开发人员快速找到问题出现的位置系统监控&#xff1a;可以把系统的运…

你不知道的node.js小知识——使用nvm管理node版本及node与npm版本对应关系详解

一、下载和安装nvm管理包 &#xff08;1&#xff09;下载链接 https://github.com/coreybutler/nvm-windows/releases (我选的是nvm-setup.exe) &#xff08;2&#xff09;解压安装 &#xff08;2次选择文件要安装的目录 第一次是nvm 第二次是node.js&#xff09; &#xff08;…

01.DolphinScheduler集群搭建

文章目录 关于Apache DolphinScheduler简介特性简单易用丰富的使用场景High ReliabilityHigh Scalability 软硬件环境建议配置1. Linux 操作系统版本要求2. 服务器建议配置生产环境 3. 网络要求4. 客户端 Web 浏览器要求 官网地址 单机部署(没啥用)前置准备工作启动 DolphinSch…

J - Playing in a Casino

题意&#xff1a;相当于比大小的赌博计算赌徒一共需要支出多少赌资 比大小的规则很简单&#xff0c;是 在这个游戏中&#xff0c;有一个套牌由n卡。每张卡都有m数字写在上面。每个n玩家从一副牌中只收到一张牌。 然后所有玩家成对玩&#xff0c;每对玩家只玩一次。因此&#x…

SpringBoot 中 4 种常用的数据库访问方式

SpringBoot 中常用的数据库访问方式主要有以下几种&#xff1a; SpringBoot 是一个非常流行的 Java 开发框架&#xff0c;它提供了大量的开箱即用的功能&#xff0c;包括数据库访问。在开发过程中&#xff0c;我们经常需要使用数据库&#xff0c;因此选择一种合适的数据库访问…

Day2_vue集成elementUI完善布局

上一节&#xff0c;实现了从O到vue页面主体框架的搭建&#xff0c;这一节补充完善搜索框&#xff1b;新增、删除、导入、导出等按钮&#xff1b;表格设置&#xff1b;分页&#xff1b;面包屑的实现&#xff01; 目录 搜索框 新增删除、导入、导出按钮 表格设置 设置边框&a…

记录安装Nodejs和HBuilderX搭建、部署微信小程序开发环境(一)

文章目录 1 前言2 注册小程序账号3 安装微信开发者工具4 安装Nodejs和HBuilderX4.1 windows用户安装Nodejs4.2 macos/linux用户安装Nodejs4.3 安装HBuilder X 5 创建项目5.1 新建一个项目5.2 进行基本配置 6 HBuilderX同步微信开发者工具6.1 打开服务端口6.2 调用微信开发者工具…

PHP初识

php简介 PHP全称超文本预处理语言&#xff0c;是在服务器端执行的脚本语言&#xff0c;是一种简单的&#xff0c;面向对象的开源脚本语言PHP脚本可以让Web开发人员快速的书写动态生成的网页 PHP脚本以<?php开始&#xff0c;以?>结束 <?php echo "hello world&…

Visual Studio调试代码教学

本篇博客主要讲解程序员最应该掌握的技能之一——调试。我个人认为&#xff0c;学习编程&#xff0c;有2件事情非常重要&#xff0c;一是画图&#xff0c;一是调试。下面我会以Visual Studio 2022为例&#xff08;VS的其他版本大同小异&#xff09;&#xff0c;演示如何调试一个…

测试开发实战项目 | 搭建Pytest接口自动化框架

一、预研背景 目前系统研发多为前后端分离&#xff0c;当后端接口研发完成后&#xff0c;可以不依赖前端界面通过接口测试提前发现问题并解决。同时由于软件迭代周期不断缩短&#xff0c;开发新功能后又担心影响原有功能&#xff0c;可以通过接口自动化进行原有功能快速回归测…

spi,iic,uart,pcie区别

一、spi SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;是同步传输协议&#xff0c;特征是&#xff1a;设备有主机&#xff08;master&#xff09;和从机&#xff08;slave&#xff09;的区分&#xff0c;主机在通讯时发送…

分治与减治算法实验: 排序中减治法的程序设计

目录 前言 实验内容 实验目的 实验分析 实验过程 流程演示 写出伪代码 实验代码 代码详解 运行结果 总结 前言 本文介绍了算法实验排序中减治法的程序设计。减治法是一种常用的算法设计技术&#xff0c;它通过减少问题的规模来求解问题。减治法可以应用于排序问题&…

mysql数据库自动备份

前言 服务器中数据库的数据是最重要的东西,如果因为某些情况导致数据库数据错误,数据错乱或数据库崩溃,这时一定要及时的修复,但如果数据丢失或数据没法用了,这时就要回滚数据了,而这时就需要我们经常的备份数据库的数据 正文 一般别人都会推荐使用Navicat来备份和连接数据库…

Kafka时间轮(TimerWheel)--算法简介

一、简介 一个简单的时间轮是一个定时器任务桶的循环列表。 让u作为时间单位。尺寸为n的时间轮有n个桶&#xff0c;可以在n*u的时间间隔内保存定时器任务。每个bucket保存属于相应时间范围的计时器任务。 在开始时&#xff0c; 第一个桶保存[0&#xff0c;u&#xff09;的任务…

第7章 “字典”

1.字典简介 字典是什么&#xff1f; 解答&#xff1a;与集合类似&#xff0c;也是一种存储唯一值的数据结构&#xff0c;但它是以键值对的形式来存储。(键值对是最重要的特性)在Es6中新增了字典&#xff0c;名为Map字典的常用操作&#xff1a;增删改查 const map new Map()/…

使用PY003基于外部中断+定时器的方式实现NEC红外解码

写在前边 最近项目用到一款遥控器是38K红外载波,NEC协议的&#xff0c;找了很多帖子有看到用外部中断下降沿判断&#xff08;但可惜判定数据的方式是while在外部中断里面死等的&#xff09;&#xff0c;有看到用100us定时器定时刷来判断&#xff0c;感觉都不太适合用在我这个工…