选择排序

选择排序

 

排序步骤(有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 {@Testpublic 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.hqwc.cn/news/18232.html

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

相关文章

基于DETR的人脸伪装检测

基于DETR的人脸伪装检测 前言前提条件实验环境项目地址LinuxWindows DETR训练自己的数据集修改models/detr.py中的参数进行训练进行预测 相关资源免费获取参考 前言 本文是个人使用DETR训练自己的COCO格式数据集的应用案例&#xff0c;由于水平有限&#xff0c;难免出现错漏&am…

ROCKSDB原理

按照读写的性质来分 分为读少写多和 写少读多 RocksDB适用于第一种。 磁盘中的数据结构 就地写和追加写 找到某一个页 然后将数据刷入到这一个页中. 这就导致了一个问题 就是追加写入的数据冗余 由于存在数据冗余 所以必须要对数据进行一定的处理才能保持查找性能 数据以块…

flutter开发实战-日志logger写入文件及print

flutter开发实战-日志logger写入文件及print 在开发中&#xff0c;需要日志logger写入文件&#xff0c;方便日后查看出现的问题。这里记录之前的实现方案。 使用的日志插件是logger 一、引入日志插件 在工程中pubspec.yaml引入logger logger: ^1.4.0二、代码实现 使用比较…

Metasploit Pro 4.22.1-2023070501 (Linux, Windows) - 渗透测试框架

Metasploit Pro 4.22.1-2023070501 (Linux, Windows) - 渗透测试框架 Rapid7 Penetration testing 请访问原文链接&#xff1a;https://sysin.org/blog/metasploit-pro-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 世界…

《第一次线下面试总结》

《第一次线下面试总结》 面试时间&#xff1a;2023/7/11 上午10点 面试总时长20分钟。 实习薪资&#xff1a;2.3k…后期看表现&#xff0c;可根据实际情况那啥 。估计是看锤子… 一、HR面 自我介绍你哪里的、目前住哪里等基本信息。你偏向前端还是后端&#xff1f;说说你的项目…

MVCC中的READ VIEW

首先我们要先清楚READ VIEW是啥 READ VIEW 是快照,就是像拍照一样 把这一瞬间的景象(数据)保存下来 我们的事务隔离等级中的 可重复读和读提交都是通过READ VIEW实现的 那 Read View 到底是个什么东西&#xff1f; m_ids:指的是在创建 Read View 时&#xff0c;当前数据库中…

6.2.5 网络基本服务----动态主机配置协议DHCP

6.2.5 网络基本服务----动态主机配置协议DHCP 动态主机配置协议允许一台计算机加入新的网络时可自动获取网络配置信息&#xff0c;不用人工参与。连网的计算机需要配置的参数包括 IP地址子网掩码默认路由器的IP地址域名服务器IP地址 DHCP与DNS、FTP、Telnet一样也采用客户服…

ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用

0. 前言 终于&#xff01;终于&#xff01;自个翻遍了网上的文章&#xff0c;加上对官网的文档和API的翻找&#xff0c;终于明白这玩意到底更新出了个啥出来&#xff01; 本文章会带你了解&#xff0c;使用 SpringDataES5.1 对 ES8.7 的【新增、修改、删除、多条件查询、聚合】…

Kafka入门,分区的分配再平衡(二十)

分区的分配以及再平衡 1、kafka有四种主流的分区策略&#xff1a;Range,RoundRobin,Sticky,CooperativeSticky。可以通过配置参数partition.assignment.strategy,修改分区的分配策略。默认策略是RanageCooperativeSticky。Kafka可以同事使用多个分区分配策略。 参数描述heartb…

Pycharm设置Python文件页眉默认信息

次点击File->Settings->Editor->File and Code Templates->然后选择Python script. 后将下列代码复制到右边的框框中&#xff0c;然后选择apply应用&#xff0c;就可以啦 ##!/usr/bin/python3 # -*- coding: utf-8 -*- # Time : ${DATE} ${TIME} # Author : 作者…

【Django】列表页面的搜索功能

目的 页面列表增加多字段搜索显示查询结果 方案 分页显示搜索结果 效果 实现 列表页面 # list.html <div class"pull-left" style"margin-bottom: 10px"><form action"{% url api-search %}" method"get"><div …

MQ集群搭建

1.⾸先&#xff0c;克隆⼀台IP地址为192.168.230.132的虚拟机&#xff0c;然后参考章节的内 容&#xff0c;在该主机上安装RabbitMQ等环境。再加上之前的虚拟机&#xff0c;这样我们就准备好了两台Linux服 务器。 修改/etc/hosts映射⽂件。 vim /etc/hosts 3.两台Linux主机修改…