【排序算法】选择排序

文章目录

  • 一:基本介绍
    • 1.1 概念
    • 1.2 算法思想
    • 1.3 思路分析图
    • 1.4 思路分析
    • 1.5 总结
      • 1.5.1 选择排序一共有数组大小-1轮排序
      • 1.5.2 每一轮排序,又是一个循环,循环的规则如下(在代码中实现):
  • 二:代码实现
    • 2.1 源码
    • 2.2 执行结果
    • 2.3 测试八万条数据
  • 三:算法性能分析
    • 3.1 时间复杂度
    • 3.2 空间复杂度
    • 3.3 稳定性

一:基本介绍

1.1 概念

选择排序(select sorting)属于内部排序法,是从待排序的数据中,按指定的规则选出某一元素,再按照规定交换位置后达到排序的目的。

1.2 算法思想

第一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1] ~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2] ~ arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1] ~arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2] ~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

每一次从待排序的数据元素中选出最小(或最大)的一个元素,将元素存放在序列的起始位置(即与待排序列的第一个元素的位置进行交换)。然后再从剩余的未排序元素中寻找最小(或最大)的元素,然后存放在已排序序列的末尾。以此类推,直到将待排序的元素全部排完。

1.3 思路分析图

在这里插入图片描述

1.4 思路分析

原始数组:[86, 21, 156, 6]

第一次排序: 从4个元素里面找到最小的,与第1个元素进行交换,将最小元素存放在起始位置

排序后为:6,21 , 156, 86

第二趟排序: 从剩下的3个元素里面找到最小的,与待排序列的第1个元素进行交换,将最小元素存放在已经排好序的序列尾部。

排序后为:6,21 , 156, 86

第三趟排序: 从剩下的2个元素里面找最小的,与待排序列的第1个元素进行交换

排序后为:6,21 , 86,156

1.5 总结

1.5.1 选择排序一共有数组大小-1轮排序

1.5.2 每一轮排序,又是一个循环,循环的规则如下(在代码中实现):

  • 先假定当前这个数是最小数
  • 和后面的每个数进行比较,如果发现有比它更小的数,就重新确定最小数,并得到下标
  • 当遍历完数组之后,就会得到本轮最小数及其下标
  • 进行交换

二:代码实现

2.1 源码

import java.util.Arrays;/*** 选择排序*/
public class SelectSort {public static void main(String[] args) {int[] array = new int[8];for (int i = 0; i < array.length; i++) {//Math.random() * 80000生成0到100的随机数array[i] = (int) (Math.random() * 100);}System.out.println("排序前:" + Arrays.toString(array));selectSort(array);System.out.println("排序后:" + Arrays.toString(array));}/*** 选择排序** @param array 需要排序的数组*/public static void selectSort(int[] array) {//使用逐步推倒的方式来讲解选择排序//第一轮//原始的数组:101,34,119,1//第一轮排序:1,34,101,119//算法先简单-->后复杂。可以将复杂算法简单化for (int i = 0; i < array.length - 1; i++) {//第一轮//假定最小处的索引就是0int minIndex = i;//最小处的数值则为int min = array[minIndex];for (int j = i + 1; j < array.length; j++) {if (min > array[j]) {//如果此条件成立,说明假定的最小值就不成立//此时我们需要重置最小值minIndex = j;min = array[minIndex];}}//交换之前需要进行判断if (minIndex != i) {//for循环结束后则最小值就已经找到了,此时我们需要将下标为0处的数重新替换为最小值//将原本最小值的位置替换为array[0]array[minIndex] = array[i];//将最小值放在array[0],即交换array[i] = min;}System.out.println("第" + i + "轮过后排序为:" + Arrays.toString(array));}}
}

2.2 执行结果

在这里插入图片描述

2.3 测试八万条数据

在这里插入图片描述
八万个数据的排序时间是1536毫秒,很明显是比冒泡排序短很多的!

三:算法性能分析

3.1 时间复杂度

最优时间复杂度、最坏时间复杂度、平均时间复杂度都是O(n^2),因为无论你是否完全有序,还是完全逆序,都需要找出后边的最小值进行替换。

相比较冒泡排序,每次比较后,只更新最小值的下标,每轮循环值最多只做一次值交换。时间上得到了很大的提升。但是也是使用了双层循环,时间复杂度和冒泡排序的一样。

3.2 空间复杂度

空间复杂度为O(1)

3.3 稳定性

选择排序是不稳定的排序算法。

举个例子:

例如数组:[ 5 , 8 , 5 , 2 ]

使用选择排序算法第一次找到的最小元素是2,与第一个位置的元素5进行交换,那此时第一个5和中间的5顺序就发生了变化,因此不稳定。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序在TS模板下引入TDesign组件

介绍 TDesign 是腾讯官方出品的一款微信小程序组件库。本文介绍如何在新建ts空白模板下引入TDesign库 步骤 新建一个空白项目&#xff0c;这里可以选择TS-基础模板 新建项目目录结构如图所示&#xff1a; 注意这里其实小程序的文件都存放在miniprogram文件夹下&#xff0c;…

vue3+ts项目02-安装eslint、prettier和sass

创建项目 项目创建 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node babel/eslint-parser vue-e…

qt判断当前日期的当月的最后一天是几号

1、拖个dateTimeEdit在界面上&#xff0c;同时来判断输入的时间的最后一天的日期是什么&#xff1f; int year,month;int monthArr[12]{31,28,31,30,31,30,31,31,30,31,30,31};QDateTime time ui->dateTimeEdit->dateTime();year time.toString("yyyy").toIn…

配置接口策略路由

【微|信|公|众|号&#xff1a;厦门微思网络】 【微思网络www.xmws.cn&#xff0c;成立于2002年&#xff0c;专业培训21年&#xff0c;思科、华为、红帽、ORACLE、VMware等厂商认证及考试&#xff0c;以及其他认证PMP、CISP、ITIL等】 组网需求 如图1所示&#xff0c;缺省情况下…

第83步 时间序列建模实战:Catboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍Catboost回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…

简单好用的CHM文件阅读器 CHM Viewer Star最新 for mac

CHM Viewer Star 是一款适用于 Mac 平台的 CHM 文件阅读器软件&#xff0c;支持本地和远程 CHM 文件的打开和查看。它提供了直观易用的界面设计&#xff0c;支持多种浏览模式&#xff0c;如书籍模式、缩略图模式和文本模式等&#xff0c;并提供了丰富的功能和工具&#xff0c;如…

数字人解决方案——ER-NeRF实时对话数字人模型训练与项目部署

前言 1、算法概述 ER-NeRF是基于NeRF用于生成数字人的方法&#xff0c;可以达到实时生成的效果。具体来说&#xff0c;为了提高动态头部重建的准确性&#xff0c;ER-NeRF引入了一种紧凑且表达丰富的基于NeRF的三平面哈希表示法&#xff0c;通过三个平面哈希编码器剪枝空的空间…

STM32:GPIO模拟SPI驱动ADS8361

ADS8361是TI公司开发的一款模拟量输入芯片。ADS8361有四种工作模式&#xff0c;本文主要针对模式三进行通信驱动。官方方案使用两路SPI来通信&#xff0c;一路SPI Master&#xff0c;一路SPI Slave。我在使用STM32主控芯片的两路SPI进行通信的时候&#xff0c;发现只有SPI Mast…

ES6 class类的静态方法static有什么用

在项目中&#xff0c;工具类的封装经常使用静态方法。 // amap.jsimport AMapLoader from amap/amap-jsapi-loader; import { promiseLock } from triascloud/utils; /*** 高德地图初始化工具*/ class AMapHelper {static getAMap window.AMap? window.AMap: promiseLock(AM…

【1】MongoDB的安装以及连接

今天是2023年10月11日&#xff0c;MongoDB最新版本是7.0.2 最近闲着没事学习一下MongoDB这个NoSQL数据库&#xff0c;有时间就顺手记录一下我学习的笔记吧~ 学习笔记来自黑马程序员《MongoDB基础入门到高级进阶&#xff0c;一套搞定mongodb》 配套资料&#xff1a;点此资料链接…

AMEYA360分享:村田电子搭载了Onsemi公司IoT设备专用IC的新Bluetooth® Low Energy模块开始量产

近年来&#xff0c;所有远程监控、远程控制的用例均要求具备可无线连接的电池驱动IoT设备&#xff0c;而长寿命电池与安全的数据通信功能是其关键。为此&#xff0c;在IoT边缘设备的设计方面&#xff0c;最大的课题是要提高功率效率和安全性。 Type 2EG由于无线与内置微处理器两…

vscode 连接ubuntu git下载缓慢

在ubuntu20.04下载&#xff1a; git clone https://github.com/introlab/rtabmap.git src/rtabmap 挂掉情况 export https_proxyhttp://10.10.10.176:7890export http_proxyhttp://10.10.10.176:7890 其中 10.10.10.176是我本机的ip地址&#xff0c;7890是我的代理后几位 如…