选择排序

news2024/11/27 14:30:15

选择排序

 

排序步骤(有n个数需要排序) 

在一组序列中找到最大/小的元素,将其与序列的起始位置交换;此时可进一步缩小排序范围,将改序列的起始位置移出;寻找剩余范围序列中的最大/小值,与此时序列的其实位置交换;以此类推,直到所有的元素排序完成

第一轮从1~n 的元素中选取最小值,若小于第一个数,则交换

第二轮从2~n 的元素中选取最小值,若小于第二个数,则交换

依次类推……

解析说明

时间复杂度为O(N^2) 

选择排序需要嵌套两层for循环来控制:外层循环控制已经排好序的数字的个数,内层循环控制剩余所需要排序的范围

比较次数O(n^2):总的比较次数N = (n-1) + (n-2) +…+ 1 = n x (n-1)/2

交换次数O(n):最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次(所有的数恰好不在对应的位置上,也就是每个位置都要找到此位置上的数)

空间复杂度为O(1) 

所有的操作均为数组间位置的交换

public static int[] selectSort(int[] arr){
        int min = 0;//最小值的索引,暂定为起始位置
        for (int i = 0; i < arr.length-1; i++) {
            min = i;//起始位置索引
            for (int j = i+1; j < arr.length; j++) {
                if(arr[min] > arr[j]){//出现一个比起始位置小的数字,就与起始位置进行交换
                    swap(arr,min,j);
                }
            }
        }
        return arr;
    }

优化

在确定数的一轮中,同时确定最大和最小值,划定一个大于起始位置、小于末尾位置的一个范围,可以将循环的次数减少至n/2

//优化:同时确定最大和最小值
    public static int[] selectSort1(int[] arr) {
        int max = arr.length - 1, min = 0;//最大、最小值的初始位置
        for (int i = 0; i < arr.length / 2; i++) {
            min = i;
            max = arr.length - i - 1;//min和max关于序列的中心保持对称
            if (arr[min] > arr[max]) {
                swap(arr, min, max);
            }
            for (int j = i + 1; j < max; j++) {
                if (arr[min] > arr[j]) {//j所在位置的数小于最小值,与min交换
                    swap(arr, min, j);
                }
                if (arr[max] < arr[j]) {//j所在位置的数大于最大值,与max交换
                    swap(arr, max, j);
                }
            }
        }
        return arr;
    }

选择排序代码

import org.junit.Test;

public class SelectSort {
    @Test
    public void test() {
        int[] arr = new int[]{12, 15, 4, 5, 8, 35};
        selectSort1(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }

    public static int[] selectSort(int[] arr) {
        int min = 0;//最小值的索引,暂定为起始位置
        for (int i = 0; i < arr.length - 1; i++) {
            min = i;//起始位置索引
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {//出现一个比起始位置小的数字,就与起始位置进行交换
                    swap(arr, min, j);
                }
            }
        }
        return arr;
    }


    //优化:同时确定最大和最小值
    public static int[] selectSort1(int[] arr) {
        int max = arr.length - 1, min = 0;//最大、最小值的初始位置
        for (int i = 0; i < arr.length / 2; i++) {
            min = i;
            max = arr.length - i - 1;//min和max关于序列的中心保持对称
            if (arr[min] > arr[max]) {
                swap(arr, min, max);
            }
            for (int j = i + 1; j < max; j++) {
                if (arr[min] > arr[j]) {//j所在位置的数小于最小值,与min交换
                    swap(arr, min, j);
                }
                if (arr[max] < arr[j]) {//j所在位置的数大于最大值,与max交换
                    swap(arr, max, j);
                }
            }
        }
        return arr;
    }

    public static void swap(int[] data, int a, int b) {
        int temp = data[a];
        data[a] = data[b];
        data[b] = temp;
    }
}

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

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

相关文章

deeplabv3+源码之慢慢解析 第二章datasets文件夹(1)voc.py--voc_cmap函数和download_extract函数

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之…

JS UMD规范实现

UMD实现范例 (function (root, factory) {if (typeof module object && typeof module.exports object) {console.log(是commonjs模块规范&#xff0c;nodejs环境);var depModule require(./umd-module-depended);module.exports factory(depModule);} else if (t…

ElasticSearch入门教程--集群搭建和版本比较

文章目录 一、ElasticSearch 集群二、Elasticsearch的核心概念2.1、分片&#xff08;Shards&#xff09;2.2、副本&#xff08;Replicas&#xff09;2.3、路由计算2.4、倒排索引 三、Kibana简介四、Spring Data ElasticSearch 一、ElasticSearch 集群 Elasticsearch 集群有一个…

python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)-续

python pytorch 纯算法实现前馈神经网络训练&#xff08;数据集随机生成&#xff09;-续 上一次的代码博主看了&#xff0c;有两个小问题其实&#xff0c;一个是&#xff0c;SGD优化的时候&#xff0c;那个梯度应该初始化为0&#xff0c;还一个是我并没有用到随机生成batch。 …

Flowable边界事件-定时边界事件

定时边界事件 定时边界事件一、定义1. 图形标记2. 完整的流程图3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 定时边界事件测试用例 总结 定时边界事件 一、定义 时间达到设定的时间之后触发事件 由于定时边界事件和开始定时事件几乎差不多&#xff0c;四种情况我就不一…

14、双亲委托模型

双亲委托模型 先直接来看一幅图 双亲委派模型的好处&#xff1a; 主要是为了安全性&#xff0c;避免用户自己编写的类动态替换Java的一些核心类&#xff0c;比如 String。 同时也避免了类的重复加载&#xff0c;因为JVM中区分不同类&#xff0c;不仅仅是根据类名&#xff0c…

React 新版官方文档 (二) useState 用法详解

背景 本文默认读者对 useState 有最为基本的了解&#xff0c;比如知道他的写法应当是怎样的&#xff0c;下面着重介绍部分重要的、在开发过程中会踩的坑和一些特性&#xff0c;最后动手实现一个最基本的 useState 代码 useState ⭐️ 注意事项: 状态只在下次更新时异步变化&…

Shiro教程(一):入门概述与基本使用

Shiro 第一章&#xff1a;入门概述 1.1 Shiro是什么 Apache.Shiro是一个功能强大且易于使用的Java安全&#xff08;权限&#xff09;框架。Shiro可以完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。借助Shiro可以快速轻松地保护任何应用程序——从最小的移…

用于3D渲染和平面设计应该怎么选择显卡?

首先了解快速解决3D渲染本地配置不足&#xff0c;节省硬件成本的方法&#xff1a; 本地电脑资源不足&#xff0c;在不增加额外的硬件成本投入的情况下&#xff0c;想要快速提升渲染速度&#xff0c;可使用渲云云渲染&#xff0c;且可批量渲染&#xff0c;批量出结果&#xff0…

centos7密码忘记恢复方法

首先启动系统看到如下界面&#xff1a; 然后按"e"键&#xff0c;看到下面的界面 然后使用"↓"按键移动光标&#xff0c; 移动到linux16 将上图中红色箭头指向的ro替换成下图中画红线的内容&#xff1a; ro替换成rw init/sysroot/bin/sh。 然后按CTRLX进入…

【ABAP】数据类型(五)「结构体概要」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较…

Spring Cloud | No URLs will be polled as dynamic configuration sources.

添加config.properties文件就行了&#xff0c;内容为空的都可以 加上该文件再次运行

基于STM32设计的简易手机

一、项目介绍 基于STM32设计的简易手机可以作为智能手表的模型进行开发&#xff0c;方便老人和儿童佩戴。项目主要是为了解决老年人或儿童使用智能手表时可能遇到的困难&#xff0c;例如操作困难、功能复杂等问题。 在这个项目中&#xff0c;采用了STM32F103RCT6主控芯片和SI…

Effective Java(第三版)目录

本书的目标是帮助读者更加有效地使用Java编程语言及其基本类库java.lang、java.util和java.io&#xff0c;以及子包java.util.concurrent和java.util.function等。本书也会时不时地讨论到其他的类库。 本书一共包含90个条目&#xff0c;每个条目讨论一条规则。这些规则…

驱动 day8 作业

1.在内核模块中启用定时器&#xff0c;定时1s,让led1 一秒亮、一秒灭 2.基于gpio子系统完成LED灯驱动的注册&#xff0c;应用程序测试 1.mychrdev_timer.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/io…

Qt DAY5 Qt制作简易网络聊天室

服务器 widget.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QVector>//向量&#xff0c;函数类模板 #include <QMessageBox>namespace Ui { class Widget; }class Wid…

STM32+FreeRTOS 使用SystemView监控系统

前言 本文以STM32F407ZET6 FreeRTOS V9.0作为演示&#xff0c;其它的Cortex M芯片同样可以参考此文&#xff0c;其他内核和RTOS理论上也支持&#xff0c;本文暂时不做研究。 所以开始阅读本文前&#xff0c;需要一块能运行FreeRTOS的Cortex M芯片&#xff0c;如果没有移植好…

发一下接口自动化测试框架(python3+requests+excel)

Git&#xff1a; https://github.com/lilinyu861/Interface-Test 环境配置&#xff1a; 开发工具&#xff1a;pycharm2018Excel 开发框架&#xff1a;python3requestsexcel 接口自动化测试框架介绍&#xff1a; 此接口测试框架&#xff0c;首先由用户设计原始的测试用例并为…

webpack笔记二

文章目录 背景拆分环境清除上次构建产物插件&#xff1a;clean-webpack-plugin合并配置文件插件&#xff1a;webpack-merge实时更新和预览效果&#xff1a;webpack-dev-server babel配置参考 背景 webpack笔记一 在前面的学习&#xff0c;完成了webpack的基本配置&#xff0c…