排序算法之选择排序介绍

news2024/11/26 23:45:08

目录

算法简介

算法描述

代码实现


算法简介

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序可以分为: 简单选择排序 和 堆排序

表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。

算法描述

这里直接拿一组数来举例:

图片

第二次交换:

图片

第三次交换:

图片

第四次交换:

图片

代码实现

/**
 * 选择排序
 * @param array
 * @return
 */
public static int[] selectionSort(int[] array) {
	if (array.length == 0)
		return array;
	for (int i = 0; i < array.length; i++) {
		int minIndex = i;
		for (int j = i; j < array.length; j++) {
			if (array[j] < array[minIndex]) //找到最小的数
				minIndex = j; //将最小数的索引保存
		}
		int temp = array[minIndex];
		array[minIndex] = array[i];
		array[i] = temp;
	}
	return array;
}

算法优化:

/**
 * 选择排序(优化:简化变量声明和交换元素操作)
 * @param array 需要排序的数组
 * @return 排序后的数组
 */
public static int[] selectionSort(int[] array) {
    if (array.length == 0) return array;

    for (int i = 0; i < array.length - 1; i++) { // 可以减少一次不必要的循环
        int minIndex = i;
        
        for (int j = i + 1; j < array.length; j++) { // 从i+1开始寻找,避免重复比较
            if (array[j] < array[minIndex]) 
                minIndex = j;
        }
        
        // 使用数组元素直接交换,无需临时变量
        int temp = array[i];
        array[i] = array[minIndex];
        array[minIndex] = temp;
    }

    return array;
}

优化后:

时间复杂度:选择排序的时间复杂度是O(n^2),因为有两层嵌套循环,分别对n个元素执行了n次比较。
空间复杂度:由于我们只使用了几个临时变量,并未使用额外的数据结构来存储数据,所以空间复杂度是O(1)。

重构解释:

1. 减少循环次数:在外部循环中,我们不需要对最后一个元素再进行遍历查找最小值,因此将条件改为 i < array.length - 1。

2. 内部循环起始值设置为 i + 1:因为在每次内部循环开始时,当前的 array[i] 已经被假设为是最小值,所以我们只需要检查后面的元素即可。

3. 元素交换方式:虽然这里已经很简洁了,但其实可以进一步优化,采用原地交换的方式,即不借助临时变量 :

temp:array[i] ^= array[minIndex];
array[minIndex] ^= array[i];
array[i] ^= array[minIndex];

但这种写法可读性较差,通常情况下还是推荐使用标准的赋值交换。

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

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

相关文章

再谈EMC Unity存储系统内存DIMM问题

以前写过一篇关于EMC Unity 存储系统的DIMM的介绍文章&#xff0c;但是最近还是遇到很多关于内存的问题&#xff0c;还有一些退货&#xff0c;所以有必要再写一篇关于EMC Unity 内存方面的问题&#xff0c;供朋友们参考。如果还有疑问&#xff0c;可以加vx&#xff1a;StorageE…

代码随想录day24(1)二叉树:最大二叉树(leetcode654)

题目要求&#xff1a; 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构…

【爬虫实战】使用Python获取花粉俱乐部中Mate60系列的用户发帖数据

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

重装系统后鼠标识别不了咋办

不知道大家在重装系统时,有没有遇到过系统重装完成后,鼠标不能使用的情况。在这种情况下,我们要怎么操作电脑解决这个问题呢?今天就跟大家分享重装系统后鼠标识别不了咋办。 一、主板没有设置兼容usb 在重装系统时,如果主板没有设置兼容usb,就会出现鼠标使用不了的现象。…

C++基础之友元(十)

由于C类的封装性&#xff0c;所以类的私有成员只能在类的内部访问&#xff0c;类之外是不能访问他们的。但是如果将其他类设置为类的友元&#xff08;friend&#xff09;&#xff0c;那么其他类也可以访问该类的私有成员。如果把类比作是一个家庭的话&#xff0c;那么private就…

安防监控平台EasyCVR使用管理员权限登录后,平台菜单栏显示不全是什么原因?

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有…

国创证券|中国资产,突传重大利好!外资最新动作曝光!

外资正在从头定价我国财物。 据彭博社最新报导&#xff0c;全球基金正在活跃购入我国股票&#xff0c;已接连第2个月净买入我国股票。其间&#xff0c;挪威的Skagen AS以及美国的Boston Partners两家全球基金近几个月来大举增持了A股、港股相关股票&#xff0c;增持的理由是&a…

最新Java面试题3【2024初级】

下载链接&#xff1a;博主已将以上这些面试题整理成了一个面试手册&#xff0c;是PDF版的 互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字…

Markdown 最全语法指南 —— 看这一篇就够了

目录 一. 前言 二. Markdown 标题语法 三. Markdown 段落语法 四. Markdown 换行语法 五. Markdown 强调语法 六. Markdown 引用语法 七. Markdown 列表语法 八. Markdown 代码语法 九. Markdown 分隔线语法 十. Markdown 链接语法 十一. Markdown 图片语法 十二. Markdown 转义…

10 个最佳免费水印去除工具,可去除照片中的任何水印

水印可以保护您的照片&#xff0c;但时不时地&#xff0c;您需要一个应用程序来删除它们。有很多免费的水印去除应用程序可以帮助您做到这一点&#xff0c;其中包括奇客水印管家&#xff0c;它还有更多功能可供探索。继续阅读以发现 10 个最佳免费水印去除剂以及如何从照片中去…

C++第八弹---类与对象(五)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、运算符重载 1.1、赋值运算符重载 1.2、前置和后置重载 2、const成员 3、取地址及const取地址操作符重载 总结 1、运算符重载 1.1、赋值运…

opencv 傅里叶变换(低通滤波 + 高通滤波)

文章目录 1、傅里叶变换2、通过numpy实现3、高通滤波器5、通过opencv实现傅里叶变换6、低通滤波器7、C实现傅里叶变换 1、傅里叶变换 时域分析&#xff1a;以时间作为参照物&#xff0c;世间万物都是随着时间变化而变化&#xff0c;并且不会停止 频域分析&#xff1a;认为世间万…

ChatGPT论文指南|分享13个学术论文写作ChatGPT口诀!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|分享13个学术论文写作ChatGPT口诀&#xff01;【建议收藏】 目录 1.段落转折 2.前言写作 3.具体论点 4.书籍介绍 AIPaperPass智…

day14-SpringBoot 原理篇

一、配置优先级 SpringBoot 中支持三种格式的配置文件&#xff1a; 注意事项 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml 是主流&#xff09;。 配置文件优先级排名&#xff08;从高到低&…

并发编程之synchronized的详细解析

4.2 synchronized 解决方案 应用之互斥 为了避免临界区的竞态条件发生&#xff0c;有多种手段可以达到目的。 阻塞式的解决方案&#xff1a;synchronized&#xff0c;Lock 非阻塞式的解决方案&#xff1a;原子变量 本次课使用阻塞式的解决方案&#xff1a;synchronized&am…

可视化设计:一文读懂桑基图,从来处来,到去出去。

一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;是一种图表类型&#xff0c;用于可视化流量、能量、资源或数量的流动。它通过使用有向箭头连接不同的节点来显示流动的路径和量级。 桑基图常用于可持续能源、物流、人口流动、资源分配等领域的数据可视化。它…

体积小,成本低,性能好单片式集成稳压器件——D7805

D7805 构成的 5V 稳压电源为输出电压5V&#xff0c;输出电流 1000mA 的稳压电源它由滤波电容 C1,C3,防止自激电容 C2、C3 和一只固定三端稳压器&#xff08;7805&#xff09;后级加 LC 滤波极为简洁方便地搭成&#xff0c;输入直流电压范围为 7~35V&#xff0c;此直流电压经过D…

ETH网络 之 Gas

Gas&#xff08;燃料&#xff09; 我们可以把 ETH 网络 想象成一辆汽车&#xff0c;如果想运行的化就需要燃料&#xff08;Gas&#xff09; Gas Fee Gas Fee是用于执行某些操作的Gas数量 * 每单位Gas的成本 Gas Fee必须用以太坊的本币支付&#xff0c;即以太币 (ETH) Gas通常以…

unity学习(63)——预制体

1.运行发现预制体初始化的时候存在问题 这里有许多技巧&#xff0c;需要细看。 2.预制体在MapHandler.cs的定义如下 3.把MapHandler绑到相机上&#xff0c;在相机的属性栏中找到赋值部分。 4.size设置成2&#xff0c;然后把模型拖拽到1号索引位置上 5.运行之后预制体确实成功实…

机器学习 - 准备数据

“Data” in machine learning can be almost anything you can imagine. A table of big Excel spreadsheet, images, videos, audio files, text and more. 机器学习其实可以分为两部分 将不管是什么data&#xff0c;都转成numbers.挑选或者建立一个模型来学习这些numbers …