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

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

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

以下是用 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.xdnf.cn/news/1545111.html

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

相关文章

模型Alignment之RLHF与DPO

1. RLHF (Reinforcement Learning from Human Feedback) RLHF 是一种通过人类反馈来强化学习的训练方法&#xff0c;它能够让语言模型更好地理解和执行人类指令。 RLHF 的三个阶段 RLHF 的训练过程一般分为三个阶段&#xff1a; 监督微调&#xff08;Supervised Fine-Tuning,…

echarts 导出pdf空白原因

问题阐述 页面样式&#xff1a; 导出pdf: 导出pdf&#xff0c;统计图部分为空白。 问题原因 由于代码中进行了dom字符串的复制&#xff0c;而echarts用canvas绘制&#xff0c;canvas内部内容不会进行复制&#xff0c;只会复制canvas节点&#xff0c;因此导出pdf空白。 解决…

1. IP地址介绍

IP地址 一、网络概述1、网络类型2、网络组成、传输介质2.1 组成2.2 传输介质 二、IP地址1、IP地址的表示方法2、IP地址的组成3、IP地址的类型3.1 根据IP地址第一个字节大小来分3.1.1 单播地址 Unicast 3.2 根据IP地址的使用 三、子网掩码 netmask1、默认的子网掩码2、判断多个I…

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么&#xff1f;有什么限制条件&#xff1f;为什么&#xff1f;对CPU和GPU产生的影响分别是什么&#xff1f; 原理&#xff1a;Unity运行时可以将一些物体进行合并&#xff0c;从而用一个描绘调用来渲染他们&#xff0c;就是一个drawcall批次。 限…

MyBatis—Plus 快速上手【后端 22】

MyBatis-Plus 使用入门指南 前言 在Java的持久层框架中&#xff0c;MyBatis因其灵活性和易用性而广受欢迎。然而&#xff0c;随着项目规模的扩大&#xff0c;MyBatis的一些重复性工作&#xff08;如CRUD操作&#xff09;开始显得繁琐。为了解决这一问题&#xff0c;MyBatis-Pl…

图论系列(dfs)9/24

岛屿问题&#xff1a; 二叉树dfs遍历的框架代码: 要有一个终止条件、访问相邻节点; public void dfs(Treenode root){if(rootnull)return;dfs(root.left);dfs(root.right);} 网格dfs遍历的框架代码: public void dfs(int[][] grid,int x,int y){//如果x、y坐标不在网格里面 …

专业学习|随机规划概观(内涵、分类以及例题分析)

一、随机规划概览 &#xff08;一&#xff09;随机规划的定义 随机规划是通过考虑随机变量的不确定性来制定优化决策的一种方法。其基本思想是在决策过程中&#xff0c;目标函数和约束条件可以包含随机因素。 &#xff08;1&#xff09;重点 随机规划的中心问题是选择参数&am…

学习一下怎么用git

目录 初始化操作 设置名字&#xff1a; 设置邮箱: 查询状态 初始化本地仓库 清空git bush控制台 git的三个区域 文件提交 将会文件提交到暂存区 暂存指定文件 暂存所有改动文件 查看暂存区里面的文件 将文件提交到版本库 git文件状态查看 ​编辑 暂存区的相关指令…

时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较

引言 近年来&#xff0c;民航旅客周转量一直是衡量国家或地区民航运输总量的重要指标之一。为了揭示民航旅客周转量背后的规律和趋势&#xff0c;本研究旨在综合分析1990年至2023年的相关数据。 通过单位根检验和序列分解&#xff0c;我们确定了民航旅客周转量数据的非平稳性&…

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时&#xff0c;如何考虑时区转换问题&#xff1f; 2. Blob和text有什么区别&#xff1f; 3. mysql里记录货币用什么字段类型比较好&#xff1f; 4. MySQL如何获取当前日期&#xff1f; 5. 你们数据库是否支持emoji表情存储&…

也遇到过 PIL Image “image file is truncated“的问题

背景前言 属于活久见系列&#xff0c;最近工作上遇了该问题&#xff01; 背景&#xff1a;前端 APP使用 Android CameraX 的接口&#xff0c;拍摄并上传图片&#xff0c;然后 Python后端服务对图片裁剪与压缩处理。后端服务处理图片时有遇到image file is truncated的情况。还…

Leetcode 螺旋矩阵

算法思想&#xff1a; 这个算法的目标是按照顺时针螺旋的顺序从矩阵中取出元素。为了做到这一点&#xff0c;整个思路可以分成几个关键步骤&#xff1a; 定义边界&#xff1a;首先需要定义四个边界变量&#xff1a; left&#xff1a;当前左边界的索引。right&#xff1a;当前右…

R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

夜间车辆 信号灯识别检测数据集 共3500张 YOLO数据集

夜间车辆 信号灯识别检测数据集 共3500张 YOLO数据集 夜间车辆与交通信号识别检测数据集&#xff08;Nighttime Vehicle & Traffic Signal Recognition Dataset&#xff09; 数据集概述 这是一个专为夜间环境设计的车辆和交通信号识别检测数据集&#xff0c;共包含3500张…

将python代码文件转成Cython 编译问题集

准备setup.py from distutils.core import setup from Cython.Build import cythonize import glob# 指定目标目录 python setup.py build -c mingw32 target_dir "src"# 使用glob模块匹配目录中的所有.pyx文件 pyx_files glob.glob(target_dir "/**/*.py&q…

基于STM32F103C8T6单片机的农业环境监测系统设计

本设计是基于STM32F103C8T6单片机的农业环境监测系统&#xff0c;能够完成对作物的生长环境进行信息监测和异常报警&#xff0c;并通过手机APP来实现查看信息和设定阈值的功能。为了实现设计的功能&#xff0c;该系统应该有以下模块&#xff1a;包括STM32单片机模块、水环境PH值…

STM32基础学习笔记-ADC面试基础题6

第六章、ADC 常见问题 1、基本概念&#xff1a;什么是ADC &#xff1f;作用 &#xff1f;逐次逼近型 2、传感器本质 &#xff1f;传感器、电压、ADC数值转化 &#xff1f; 3、ADC的特征 &#xff1f; 转化时间、分辨率、精度、量化误差 &#xff1f; 4、ADC框图组成部分 &…

如何安全有效地进行Temu自养号测评,提升账号权重防关联

在当今市场环境中&#xff0c;许多现成的系统或软件包往往缺乏全面的风险控制能力。掌握自养号测评技术&#xff0c;确保在运营过程中减少对外部系统的依赖。以下是搭建安全、高效运营环境的详细指导&#xff0c;特别针对手机端与电脑端环境的设置&#xff0c;以及关键资源的获…

计算机毕业设计Hadoop+Spark知识图谱体育赛事推荐系统 体育赛事热度预测系统 体育赛事数据分析 体育赛事可视化 体育赛事大数据 大数据毕设

《HadoopSpark知识图谱体育赛事推荐系统》开题报告 一、研究背景及意义 随着互联网技术的迅猛发展和大数据时代的到来&#xff0c;体育赛事数据的数量呈爆炸式增长。用户面对海量的体育赛事信息&#xff0c;常常感到信息过载&#xff0c;难以快速找到感兴趣的赛事内容。如何高…

虚拟机屏幕分辨率自适应VMWare窗口大小

文章目录 环境问题解决办法其它虚拟机和主机间复制粘贴 参考 环境 Windows 11 家庭中文版VMWare Workstation 17 ProUbuntu 24.04.1 问题 虚拟机的屏幕大小&#xff0c;是固定的。如下图&#xff0c;设置的分辨率是800*600&#xff0c;效果如下&#xff1a; 可见&#xff0c…