(十一)排序算法-选择排序

news/2024/11/17 18:23:20/

1 基本介绍

选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
动画展示:
在这里插入图片描述

选择排序思想:
选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:
第一次从 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轮排序
  • 每一轮排序,又是一个循环,循环的规则如下(在代码中实现):
    • 先假定当前这个数是最小数
    • 和后面的每个数进行比较,如果发现有比它更小的数,就重新确定最小数,并得到下标
    • 当遍历完数组之后,就会得到本轮最小数及其下标
    • 进行交换

2 代码实现

2.1 代码实现

/*** 选择排序*/
public class SelectSort {public static void main(String[] args) {/*int[] arr = {45,2,6,265,34234,46,234,3,63,45,3,45,2,5,74,52};System.out.println(Arrays.toString(arr));System.out.println("------------排序前------------");selectSort(arr);System.out.println("------------排序后------------");System.out.println(Arrays.toString(arr));*/// 测试// 创建80000个随机的数组int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random() * 80000);}System.out.println("-----------排序前-----------");System.out.println(Arrays.toString(arr));selectSort(arr);System.out.println("-----------排序后-----------");System.out.println(Arrays.toString(arr));}public static void selectSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;int min = arr[i];for (int j = i + 1; j < arr.length; j++) {if(min > arr[j]){minIndex = j;min = arr[j];}}if(minIndex != i){arr[minIndex] = arr[i];arr[i] = min;}}}
}

2.2 算法性能分析

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

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

空间复杂度
空间复杂度为O(1)

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


http://www.ppmy.cn/news/42817.html

相关文章

word文件上的电子签章的法律效力如何保证?

你有没有见过这样的word文件“电子签章”&#xff1f; 这种用PS制作的“电子签章”&#xff0c;或者在一些输入公司名称就能在线生成“电子签章”的小网站、小作坊买来的“电子签章”&#xff0c;通通都是没有法律效力的贴图章&#xff01; 使用贴图章的word文件不但没有任何…

BCM系统组成及控制原理

1 输入控制 由于负载能力、抗干扰能力等客观情况。许多信号量无法直接施加至MCU之上&#xff0c;须有适当的输入电路(Input circuit)将信号进行隔离、调理&#xff0c;方可安全可靠地传递给MCU。 下面以开关信号和脉冲信号2种来分述。 1)开关信号的输入。 即将系统与电源正…

数据库事务管理

在关系型数据库中&#xff0c;事务的实现通常采用“日志”&#xff08;Log&#xff09;技术。当一个事务开始时&#xff0c;系统将对所有需要修改的数据进行备份&#xff0c;并在内存缓冲区中维护一个日志记录。这些修改操作仅在事务提交时才被写回到磁盘上的数据库文件中&…

常用 Composition API--工程文件及setup

官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 分析工程结构 vue3新添加的东西或修改的内容 首先import { createApp } from vue引入的不再是Vue的构造函数了&#xff0c;而是一个createAPP的工厂函数&#xff0c;什么是工厂函数&#xff1f; …

DW3000芯片驱动API介绍

目录 通用软件框架 典型的系统启动流程 IRQ中断处理流程 通用软件框架 下图显示了包含DW3xxx设备驱动程序API的软件系统的总体框架。设备驱动程序通过SPI接口控制IC。设备驱动程序通过通用函数writetospi()和readfromspi()调用目标SPI设备来抽象目标SPI设备。在将IC设备驱动…

python 理解BN、LN、IN、GN归一化、分析torch.nn.LayerNorm()和torch.var()工作原理

目录 前言&#xff1a; 简言之BN、LN、IN、GN等归一化的区别&#xff1a; 批量归一化(Batch Normalization&#xff0c;BN) 优点 缺点 计算过程 层归一化(Layer Normalization&#xff0c;LN) 优点 计算过程 总结 分析torch.nn.LayerNorm()工作原理 分析torch.var(…

光电隔离转换器 直流信号放大器 导轨安装DIN11 IPO OC系列

概述&#xff1a; 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

Windows环境下实现设计模式——职责链模式(JAVA版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows环境下如何编程实现职责链模式&#xff08;设计模式&#xff09;。 不知道大家有没有这样的感觉&#xff0c;看了一大堆编程和设计模式的书&#xff0c;却还是很难理解设计模式&#xff…