java选择排序(Selection Sort)——详解讲解+案例+时间复杂度

2023-10-29

需求

排序前:{4,6,8,7,9,2,10,1}
排序后:{1,2,4,5,7,8,9,10}


排序原理

1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处
的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引
2.交换第一个索引处和最小值所在的索引处的值在这里插入图片描述


案例

选择排序API设计:
在这里插入图片描述
代码实现:

package study.sort;

//选择排序API,毕竟真正的排序不可能只是给你一个数字数组
public class Selection {
    //对数组内的元素进行排序
    public static void sort(Comparable[] a){
        //外循环次数表示选择次数,记住循环次数为(a.length - 1)
        for (int i = 0; i < a.length - 1; i++) {
            //每次外循环开始,就假定剩下需要排序的数据中,最小值的索引为i
            int minIndex = i;
            //内循环,从当前索引到数组最后一个数据,找出剩下数据中最小值的索引,并赋值为minIndex
            for (int j = i + 1; j < a.length; j++) {
                if (greater(a[minIndex],a[j])){
                    minIndex = j;
                }
            }
            //交换i索引和minIndex索引处的值
            exchange(a,minIndex,i);
        }
    }

    //判断v是否大于w
    private static boolean greater(Comparable v, Comparable w) {
        return v.compareTo(w) > 0;
    }

    //交换a数组中,索引i和索引j处的值
    private static void exchange(Comparable[] a, int i, int j) {
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

package study.Test;

import study.sort.Selection;

import java.util.Arrays;

public class SelectionTest {
    public static void main(String[] args) {
        //测试为了方便起见就用单纯的数字数组
        Integer[] a = {4,6,8,7,9,2,10,1};
        System.out.print("排序前: ");
        System.out.println(Arrays.toString(a));
        System.out.print("排序后: ");
        Selection.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

效果图:
在这里插入图片描述


选择排序的时间复杂度分析

选择排序使用了双层for循环,其中外层循环完成了数据交换,内层循环完成了数据比较,所以我们分别统计数据
交换次数和数据比较次数:
数据比较次数:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
数据交换次数:
N-1
时间复杂度:N^ 2/2-N/2+(N-1)=N^2/2+N/2-1;
根据大O推导法则,保留最高阶项,去除常数因子,时间复杂度为O(N^2);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java选择排序(Selection Sort)——详解讲解+案例+时间复杂度 的相关文章

  • 03-java数据结构之链表的学习(单链表、双链表等)

    文章目录 1 链表 1 1 链表的介绍 2 单链表 2 1 单链表的显示 2 2 单链表的添加操作 2 2 1 直接添加到链表的尾部 2 2 2 根据no插入到指定位置 2 3 单链表节点的修改 2 4 单链表节点的删除 3 双向链表 3
  • Java List与ArrayList

    目录 List的介绍 什么是List List的使用 ArrayList与顺序表 ArrayList简介 ArrayList的使用 ArrayList的常见操作 ArrayList的扩容机制 ArrayList的模拟实现 List的介绍 什
  • java选择排序(Selection Sort)——详解讲解+案例+时间复杂度

    文章目录 需求 排序原理 案例 选择排序的时间复杂度分析 需求 排序前 4 6 8 7 9 2 10 1 排序后 1 2 4 5 7 8 9 10 排序原理 1 每一次遍历的过程中 都假定第一个索引处的元素是最小值 和其他索引处的值依次进行
  • Java实现栈和队列

    前言 栈和队列是两种特有的存储数据的结构 栈是后进先出的一种结构 队列是先进先出的一种结构 由于这种特有的结构 在选择底层存储方式也有差异 由于栈是后进先出的结构 其实就是尾删 尾增操作 如果用顺序表来存储 尾删 尾增时间复杂度则是O 1
  • Java实现顺序表

    目录 一 顺序表的简单理解 1 为什么我们要以数组为基础来构建顺序表呢 2 顺序表都具有哪些功能 二 顺序表的代码实现 1 构建并且初始化顺序表 2 在顺序表中添加元素 1 判断需要添加元素的下标是否在顺序表的范围内 2 如果添加元素下标合
  • Java中的装包(装箱)和拆包(装包)

    装箱和拆箱 在Java的学习中 我们有的时候会设计装箱和拆箱的概念 也就是常说的装包和拆包 这篇博客将详细讲解一下装箱和拆箱的概念及其用途 装箱 装包 将基本数据类型转换成包装类类型 拆箱 拆包 将包装类类型转换成基本数据类型 装箱 注意
  • leetcode1921.消灭怪物的最大数量(中等)

    解法 排序 贪心 具体 计算出每个怪物到达城市的时间 然后排序 class Solution public int eliminateMaximum vector
  • 【Java】Map和Set

    目录 一 搜索树 1 概念 2 操作 查找 3 操作 插入 4 操作 删除 难点 6 性能分析 二 搜索 1 概念及场景 2 模型 三 Map 的使用 1 关于Map的说明 2 关于Map Entry的说明 gt 3 Map 的常用方法说明
  • 链表——一种线性数据结构

    链表 链表中的每个元素实际上是一个单独的对象 而所有对象都通过每个元素中的引用字段链接在一起 线性数据结构 与数组一样 链表也是线性数据结构 他们的区别在于存储方式不同 顺序存储结构 数组 快速的存和取 逻辑上相邻 物理上也相邻 链式存储结
  • Java初识泛型

    目录 一 包装类 1 基本数据类型和对应的包装类 2 装箱和拆箱 3 自动装箱和自动拆箱 二 什么是泛型 三 引出泛型 1 泛型的语法 四 泛型类的使用 1 语法 2 示例 3 类型推导 Type Inference 六 泛型如何编译的 1
  • 排序——冒泡排序(Bubble sort)

    定义 冒泡排序是一种较简单的排序算法 它重复地走访过要排序的元素列 依次比较两个相邻的元素 如果顺序 如从大到小 首字母从Z到A 错误就把他们交换过来 走访元素的工作是重复地进行直到没有相邻元素需要交换 也就是说该元素列已经排序完成 这个算
  • Java数据结构之优先级队列(堆)

    文章目录 一 优先级队列 一 概念 二 优先级队列的模拟实现 一 堆的概念 二 堆的存储结构 三 堆的创建 1 堆的创建和向下调整 2 堆的创建和向上调整 四 堆的插入和删除 1 堆的插入 堆的创建和向上调整 续 2 堆的删除 五 用堆模拟
  • 二分搜索——分治思想

    二分查找 二分查找是一种在每次比较之后将查找空间一分为二的算法 每次需要查找集合中的索引或元素时 都应该考虑二分查找 如果集合是无序的 我们可以总是在应用二分查找之前先对其进行排序 时间复杂度是 log N 因为 二分查找是通过将现有数组一
  • JAVA版的数据结构——链表

    目录 1 单向不带头链表 1 1 链表的概念及结构 1 2 代码部分 1 3 完整的全部代码 2 双向不带头链表 2 1 代码部分 2 2 完整的代码 3 MySingleList与MyLinkedList代码上的区别 4 LinkedLi
  • Java对象的比较

    在Java中的比较有两种 基本类型之间的比较和引用类型之间的比较 对于基本类型来说 可以进行直接的比较 int long short byte 可以用 lt gt 进行比较 返回值为 true 或者 false char 也是用 lt gt
  • 基于线性表的图书管理系统(java)

    目录 1 简介 2 代码 1 ManageSystem类 2 book类 3 测试程序运行结果截图 1 登录和创建 2 输出 3 查找 4 插入 5 删除 6 修改 7 排序 8 计数 9 导出 10 读入 11 菜单 4 存在的问题与思考
  • Java版的数据结构——栈和队列

    目录 1 栈 Stack 1 1 概念 1 2 栈的使用 1 3 栈的模拟实现 1 4 栈的应用场景 1 4 1 改变元素的序列 1 4 2 将递归转化为循环 2 队列 Queue 2 1 概念 2 2 队列的使用 2 3 队列模拟实现 2
  • Java中的排序算法

    冒泡排序 核心思想 冒泡排序 核心思想 冒泡排序 Bubble Sort 又被称为气泡排序或泡沫排序 它是一种较简单的排序算法 它会遍历若干次要排序的数列 每次遍历时 它都会从前往后依次的比较相邻两个数的大小 如果前者比后者大 则交换它们的
  • ArrayList与顺序表

    目录 编辑 一 线性表 二 顺序表 1 接口的实现 1 打印顺序表 2 新增元素 3 判定是否包含某个元素 4 查找某个元素对应的位置下标 5 获取 pos 位置的元素 6 获取顺序表长度 7 给 pos 位置的元素设为 value 更新的
  • 【Java 数据结构】单链表与OJ题

    篮球哥温馨提示 编程的同时不要忘记锻炼哦 暮色降临 冲一杯咖啡 目录 1 什么是链表 2 实现一个单向非循环链表 2 1 实现前的约定 2 2 addFirst 方法 2 3 addList 方法 2 4 addIndex 方法 2 5 c

随机推荐

  • 平摊分析典型例题及解答

    Exercise 1 5 对某个数据结构执行大小为 n 的一个操作序列 若 i 为 2 的整数幂 则第 i 个操作的代价 为 i 否则为 1 请利用会计方法分析每次操作的平摊代价 Exercise 2 15 Bill 提出了一种叫做翻转堆栈
  • SpringClud Sleuth + Zipkin + Kafka实现分布式链路追踪

    SpringClud Sleuth Zipkin Kafka实现分布式链路追踪 使用步骤 使用步骤 1 导入 pom 依赖
  • 关于Spring Cloud Gateway 网关限流

    本文将使用以下两种方式实现网关的限流 使用 Spring Cloud Gateway 的 RequestRateLimiter 过滤器工厂基于 Redis 的限流 使用 Sentinel 结合 Spring Cloud Gateway 来实
  • vue动态组件component详解

    附上代码
  • 演唱会门票抢不到?不要慌,教你用python实现自动化抢票

    前言 之前有小伙伴留言说女朋友快生日了 喜欢某某某但是手动买票根本就是买不到 又不想当大冤种从黄牛手里加钱 于是乎在疯狂星期四的晚上遭到 贿赂 的我连夜搞定了 一丶安装环境和配置文件 要用python实现 下载和安装python自然是不用说
  • P1016 旅行家的预算【模拟+贪心】【详解】

    题目链接 思路 这道题是一道很明显的模拟题 但这道题也需要自己的理解 我自己写了些样例 然后找到了其中的模拟 我们假设从一个点出发 对于它的下一个点我们有很多选择 期间定义一个len用以记录满油 单次最远 到达距离 我们造访这条路上的所有点
  • MYSQL数据库(六)用户、权限管理和DCL语句

    成功不易 加倍努力 1 MySQL用户管理 2 权限管理和DCL语句 3 MySQL的图形化的远程管理工具 1 MySQL用户管理 元数据数据库 mysql 系统授权表 USERNAME HOST HOST 主机名 user1 web1 m
  • 区块链到底是怎么运行的

    为了方便你理解 这一篇文章我将以比特币为例来进行讲解 因为比特币算是区块链应用中最简单 最容易理解的一个案例了 中心化记账的问题 首先 举一个关于中心化记账的经典例子 银行转账 假设小明给小红转200块 银行收到了转账请求 将小明银行账户里
  • 区块链hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现 主要代码由IBM Intel 各大银行等贡献 目前v1 1版的kafka共识方式可达到1000 s次的吞吐量 本文中我们依次讨论 区块链的共通特性 fabric核心概念 fab
  • vue全局一个格式化时间-format

    vue圈定定义一个format 用来格式化时间 Date prototype format function fmt const o M this getMonth 1 月份 d this getDate 日 h this getHours
  • Sudo: unable to initialize policy plugin 解决方法

    在centos7下 使用sudo 命令对www用户生成ssh秘钥 结果报错如下 Sudo parse error in etc sudoers near line 125 Sudo no valid sudoers sources foun
  • OS - 操作系统实战 - 学习/实践

    1 应用场景 主要用于学习 设计和编写操作系统 同时帮助更加好低理解操作系统 研究Linux系统 提供编程能力 2 学习 操作 1 文档阅读 操作系统实战45讲 操作系统 Linux 计算机基础 底层 内核 后端开发 iOS 彭东 C语言
  • c++中string的substr函数

    在 C 中 substr 函数用于提取字符串的子串 它有两种常用的用法 1 substr pos len 提取从位置 pos 开始的长度为 len 的子串 pos 指定提取子串的起始位置 位置从 0 开始 len 指定提取子串的长度 如果不
  • 2019年3月web前端最新面试题

    最近在找工作 面试了好多家公司 结果都不怎么理想 要么公司环境氛围不行 要么工资达不到理想的薪资 大部分公司对程序员的面试流程几乎都一样 来了先填一份登记表 写一套面试题 然后技术面 人事面 至于有的大牛说 四面web前端 拿到10K 的工
  • js 搜索关键字高亮

    主要是通过replace方法实现的 实现代码
  • SSTI 学习笔记

    PHP SSTI Twig 学习文章 进入环境 左上角有flag hint 都检查看看 flag页面显示ip hint页面源代码有提示 考虑XFF头或者referer头 测试一下 注 这里不用加上 出来了 python flask ssti
  • 30岁之后想转行,可行吗?这20条建议让你少走弯路!

    都说三十而立 可眼看着到了意气风发的年龄 却突然意识到自己仍一事无成 甚至连养活自己都是问题 30多岁 大多数人还要开始买房 买车 结婚生子 养家糊口 于是各种压力逼迫之下 就想到了转行 期望可以通过转行实现 财务自由 不过 俗话说 隔行如
  • 函数strlen的使用

    函数strlen是C语言的提供的函数 它包含在 include
  • Linux命令_printf & 格式化输出信息

    目录 1 语法 1 1 格式化参数 1 2 转义符参数 2 常见用法 2 1 输出字符串 2 2 格式化输出 2 3 设置格式对齐 2 4 控制输出宽度 2 5 替换补全字符 3 设置颜色 3 1 参数选项 3 2 基本用法 3 3 设置文
  • java选择排序(Selection Sort)——详解讲解+案例+时间复杂度

    文章目录 需求 排序原理 案例 选择排序的时间复杂度分析 需求 排序前 4 6 8 7 9 2 10 1 排序后 1 2 4 5 7 8 9 10 排序原理 1 每一次遍历的过程中 都假定第一个索引处的元素是最小值 和其他索引处的值依次进行