【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法

选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
在这里插入图片描述

以下是用 Java 实现的选择排序代码示例:

public class SelectionSort {public static void selectionSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {// 找到未排序部分的最小元素的索引int minIndex = i;for (int j = i + 1; j < n; j++) {if (array[j] < array[minIndex]) {minIndex = j;}}// 交换最小元素和当前位置的元素int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}}public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};selectionSort(array);System.out.println("排序后的数组:");for (int i : array) {System.out.print(i + " ");}}
}

在 Python 中的实现如下:

def selection_sort(alist):for i in range(len(alist)-1):max_index=ifor j in range(i+1,len(alist)):if alist[j]>alist[max_index]:max_index=jalist[max_index],alist[i]=alist[i],alist[max_index]return alistif __name__ == '__main__':alist=(449,333,441,555,666,777,888,999,332,222,111)print("the init of list is:",alist)print("the sorted of list is:",selection_sort(alist))

选择排序算法通过两个嵌套的循环来实现。外层循环控制已排序部分的增长,内层循环用于找到未排序部分的最小(或最大)元素的索引。找到最小(或最大)元素后,将其与未排序部分的第一个元素进行交换,从而逐步将整个序列排序完成。

选择排序算法的时间复杂度为 O(n²),其中 n 是待排序元素的数量。这是因为无论原始数据的排列情况如何,算法都需要进行相同数量的比较和交换操作。空间复杂度为 O(1),因为它只需要有限的额外空间来存储临时变量,而不依赖于输入数据的大小。

选择排序算法虽然简单易懂,但在处理大规模数据时效率较低。在实际应用中,可以根据具体情况选择更高效的排序算法,如快速排序、归并排序等。

选择排序算法思想是什么

选择排序是一种简单直观的排序算法。其基本思想是将待排序的数据分为已排序和未排序两部分。首先在未排序的数列中查找到最小(或最大)元素,然后将其存放到数列的起始位置,此时已排序部分就有了一个元素。接着,再从剩余未排序的元素中继续寻找最小(或最大)的元素,放到已排序序列的末尾。如此重复这个过程,直到所有元素都被排序完毕。

例如,对于数组{20,40,30,10,60,50}第一趟会找到最小元素10,将其与数组第一个元素20交换得到{10,40,30,20,60,50}。第二趟从剩余未排序元素{40,30,20,60,50}中找到最小元素20,与第二个元素40交换,变为{10,20,30,40,60,50}。后面继续这个过程,直到整个数组有序。

选择排序的优点是实现简单,不占用额外的内存空间。缺点是时间复杂度较高,为O(n²),不太适合处理大规模数据。

选择排序算法的 Java 实现代码

以下是选择排序算法的 Java 实现代码:

public class SelectionSort {public static void main(String[] args) {int[] arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};arr = selectionSort(arr);for (int a : arr) {System.out.print(a + ",");}}public static int[] selectionSort(int[] arr) {int min,temp;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]) {min = j;}}temp = arr[i];arr[i] = arr[min];arr[min] = temp;}return arr;}
}

在这个实现中,外层循环控制当前待排序的位置,内层循环用来找到未排序部分的最小元素的下标。然后将当前待排序位置的元素与最小元素进行交换。通过持续地重复这个过程,直到所有元素都被排序。

选择排序算法的 Python 实现代码

选择排序算法的 Python 实现如下:

def selection_sort(arr):n = len(arr)for i in range(n):min_index = ifor j in range(i + 1, n):if arr[j] < arr[min_index]:min_index = jarr[i], arr[min_index] = arr[min_index], arr[i]return arrnums = 
print("待排序的数列:", nums)
sorted_nums = selection_sort(nums)
print("排序后的结果为:", sorted_nums)

这段代码首先定义了一个函数selection_sort,函数接收一个待排序的列表作为参数。在函数内部,通过两个嵌套的循环实现选择排序。外层循环遍历列表的每个位置,内层循环在未排序部分找到最小元素的下标。最后,将当前位置的元素与最小元素进行交换,直到整个列表有序。

选择排序算法时间复杂度是多少

选择排序算法的时间复杂度为 O(n²)。其中 n 是待排序数据的数量。

选择排序的工作方式是每一次从待排序的数据中选择最小(或者最大)的一个元素,放到序列的起始位置,直到全部待排序的元素排完。在每一趟排序中,都需要遍历未排序部分的所有元素来找到最小(或最大)元素,对于一个长度为 n 的数组,第一趟需要比较 n - 1 次,第二趟需要比较 n - 2 次,以此类推。总的比较次数为 (n - 1) + (n - 2) +… + 1,根据等差数列求和公式可得总比较次数为 n(n - 1)/2,近似为 n²/2。当 n 趋向于无穷大时,时间复杂度的量级为 n²,记作 O(n²)。

虽然选择排序的时间复杂度比较高,但是由于其实现简单,所以在数据规模较小时,选择排序仍然是一种较为常用的排序算法。

选择排序算法空间复杂度是多少

选择排序算法的空间复杂度为 O(1)。

选择排序是原地排序算法,它在排序过程中不需要额外的存储空间,只需要几个变量来记录最小元素的下标和进行元素交换时的临时变量。无论待排序数据的规模有多大,所需的额外空间都是固定的,不随输入数据的规模而增长。

总结

选择排序算法思想是每次从未排序部分选择最小(或最大)元素放到已排序部分末尾;Java 和 Python 实现代码通过嵌套循环找到最小元素并进行交换;时间复杂度为 O(n²),不太适合大规模数据排序;空间复杂度为 O(1),是原地排序算法。选择排序在数据规模较小时,因其简单易实现仍有一定的应用价值。

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

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

相关文章

vue3常用的组件间通信

一 props props 可以实现父子组件通信&#xff0c;props数据是只读。 1. 基本用法 在父组件中&#xff0c;你可以这样传递 props&#xff1a; <template><ChildComponent message"Hello, Vue 3!" /> </template><script setup> import C…

WebPage-Bootstrap框架(container类,container-fluid类,栅格系统)

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【Bug解决】Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.88的响应时间过长)

情形如下&#xff1a;第一次启动运行一些正常&#xff0c;非正常关闭虚拟机&#xff0c;第二次启动虚拟机查看容器状态如下&#xff1a; docker nacos容器一切正常启动&#xff0c;但是就是无法访问web控制面板&#xff0c;访问无法连接。 首先&#xff1a;执行命令查看日志 …

设置元素浮动,出现高度塌陷导致鼠标无法点击

先贴代码片段&#xff1a; <div style"width: 30%; float: left;"><nz-input-group nzSearch [nzAddOnAfter]" suffixIconButton"><input type"text" nz-input placeholder"请输入实验名称" [(ngModel)]"q.name&…

glTF格式:WebGL应用的3D资产优化解决方案

摘要 glTF作为一种高效的3D资产格式&#xff0c;为WebGL、OpenGL ES和OpenGL运行时的应用提供了强有力的支持。它不仅简化了3D模型的传输与加载流程&#xff0c;还通过优化资产大小&#xff0c;使得打包、解包更加便捷。本文将深入探讨glTF格式的优势&#xff0c;并提供实用的代…

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域&#xff0c;ClickHouse 作为一款高性能的列式数据库&#xff0c;以其出色的查询速度和对大规模数据的处理能力&#xff0c;广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…

初探shell与bash使用指南

文章目录 一、shell二、bash第一步、新建脚本第二步、添加权限第三步、执行bash脚本 在日常开发中&#xff0c;经常使用到Linux服务器相关知识&#xff0c;输入命令获取想要的结果&#xff0c;本篇介绍shell 与 bash的相关知识。 一、shell 是命令行解释器&#xff0c;接收用户…

nlohmann json:读写json文件

读写json文件是经常的操作,可以通过如下的方式完成: #include <string> #include <iostream> #include <fstream> #include <filesystem> #include <nlohmann/json.hpp>using namespace std; using json = nlohmann::json; namespace fs = st…

使用nc命令检测UDP端口

使用nc命令检测UDP端口也是非常的简单&#xff0c;需要注意的是&#xff0c;所安装nc的版本不同&#xff0c;使用选项有点差异。 1、检测开启的UDP nc -vuz 192.168.2.201 5353 nc -vuz 192.168.2.201 37430 端口正常启用时&#xff0c;会提示“UDP packet sent successful…

深入解析网络通信关键要素:IP 协议、DNS 及相关技术

我的主页&#xff1a;2的n次方_ 1. IP 协议报头结构 4 位版本&#xff1a;表示 IPv4 / IPv6 4 位首部长度&#xff1a;表示 IP 报头的长度&#xff0c;以 4 字节为单位 8 位服务类型&#xff1a;包括 3 位优先权字段&#xff08;已弃用&#xff09;&#xff0c;4 位 TOS 字…

电路 - 笔记2

1 555 芯片 2 类比 - pU*I 与 Fm*a 是不是可以与牛顿定律类比 - Fm*a 人的力量&#xff08;F&#xff09;有限。 当推大箱子&#xff08;m&#xff09;时&#xff0c;加速度&#xff08;a&#xff09;就不会很大 当推小箱子&#xff08;m&#xff09;时&#xff0c;加速度…

分布式框架 - ZooKeeper

一、什么是微服务架构 1、单体架构 顾名思义一个软件系统只部署在一台服务器上。 ​ 在高并发场景中&#xff0c;比如电商项目&#xff0c;单台服务器往往难以支撑短时间内的大量请求&#xff0c;聪明的架构师想出了一个办法提高并发量&#xff1a;一台服务器不够就加一台&am…

球体检测系统源码分享

球体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Ubuntu20.04点击文件闪退

在 Ubuntu 系统下&#xff0c;如果点击文件按钮导致系统闪退&#xff0c;可以尝试以下几种解决方法&#xff1a; 更新系统和应用程序&#xff1a; 确保你的系统和所有应用程序都是最新版本。可以通过终端执行以下命令来更新系统&#xff1a; sudo apt update sudo apt upgrade重…

python爬虫解析神器Xpath——lxml库(9)

文章目录 1、Xpath1.1 什么是xpath?1.2 xpath的原理1.3 xml介绍1.3.1 什么是xml?1.3.2 xml和html的区别?1.3.3 xml文档的节点关系1.4 xpath语法的使用1.4.1 选取节点1.4.2 选取未知节点1.4.3 同时使用多个路径表达式2、lxml库2.1 介绍2.2 基础使用2.3 文件读取html文档2.4 实…

springboot实战学习笔记(5)(用户登录接口的主逻辑)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发以及注册时的参数合法性校验。具体往回看了解的链接如下。 springboot实训学习笔记&#xff08;4&#xff09;(Spring Validation参数校验框架、全局异常处理器)-CSDN博客文章浏览阅读576次&#xff0c;点赞7…

Agile Modbus STM32裸机移植 从机使用

本教程手把手教你实现Agile Modbus,照抄就能成。 并且会解读函数功能含义。 1. 引言 Agile Modbus 是一个轻量级的 Modbus 协议栈,可以满足用户在任何场景下的需求。 功能 支持 rtu 和 tcp 协议,使用纯 C 语言开发,不涉及任何硬件接口,可以直接在任何形式的硬件上使用。由…

序列化与反序列化深入分析:UUID案例的实践与JSON转换对比

在Java开发中&#xff0c;序列化和反序列化是非常重要的概念。序列化是将对象的状态转换为字节流的过程&#xff0c;而反序列化则是将字节流恢复为对象的过程。本文将以UUID序列化案例和JSON转换为例&#xff0c;深入探讨这两者的具体实现及应用场景。 1. Java 序列化与反序列化…

深入理解Spring Data JPA与接口编程

目录 1. 什么是Spring Data JPA&#xff1f; 2. 如何使用Spring Data JPA&#xff1f; 3. 示例代码 4. 使用Query注解 5. 拓展知识&#xff1a;接口编程的好处 6. 结论 在软件开发领域&#xff0c;接口&#xff08;Interface&#xff09;是一种定义了方法签名但没有实现的…

Fyne ( go跨平台GUI )中文文档-小部件 (五)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…