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

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

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

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

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

相关文章

【JS】Reflect

对象基本方法 JS语法操作对象时&#xff0c;本质上是调用一个内部封装好的函数&#xff0c;该函数中又会调用对象的基本方法&#xff0c;通过官方文档可以看到基本方法。在过去&#xff0c;这些对象的基本方法是不会对外暴露的。 如下面这段代码&#xff0c;使用JS语法给对象赋…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Ga…

网络层协议——IP

目录 IP层 IP报文格式 IP的理解 运营商 分片与组装 IP层 传输层的TCP或者UDP协议能直接将数据发送到网络中吗&#xff1f;显然不能&#xff0c;封装完的TCP报文还是需要向下交付&#xff0c;经过协议栈&#xff0c;从链路层发送到物理层也就是网路中。 那么tcp做了什么工…

9.创新与未来:ChatGPT的新功能和趋势【9/10】

创新与未来&#xff1a;ChatGPT的新功能和趋势 引言 在探讨人工智能的发展历程时&#xff0c;我们可以看到它已经从早期的图灵机和人工神经网络模型&#xff0c;发展到了今天能够模拟人类智能的复杂系统。人工智能的起源可以追溯到20世纪40年代&#xff0c;而它的重要里程碑包…

【ARM】MDK-当选择AC5时每次点击build都会全编译

1、 文档目标 解决MDK中选择AC5时每次点击build都会全编译 2、 问题场景 在MDK中点击build时&#xff0c;正常会只进行增量编译&#xff0c;但目前每次点击的时候都会全编译。 3、软硬件环境 1 软件版本&#xff1a;Keil MDK 5.38a 2 电脑环境&#xff1a;Window 10 4、解决…

centos7 配置 docker 国内镜像源

1.修改配置文件/etc/docker/daemon.json sudo vim /etc/docker/daemon.json2.增加或修改以下配置内容 {"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","http…

网页爬虫法律与道德:探索法律边界与道德规范

目录 引言 一、网络爬虫技术概述 1.1 定义与功能 1.2 技术原理 1.3 案例分析 二、网络爬虫的法律边界 2.1 合法性要求 2.2 刑事风险 2.3 案例分析 三、网络爬虫的道德规范 3.1 尊重版权和隐私 3.2 合理使用爬虫技术 3.3 透明度和社会责任 四、技术挑战与应对策略…

面试经典 150 题:力扣88. 合并两个有序数组

每周一道算法题启动 题目 【题目链接】 【解法一】合并后排序 排序后的数组自动省略0的数字&#xff0c;又学到了 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {//合并两个数组后排序for(int i0; i<…

傅里叶变换及其应用笔记

傅里叶变换 预备知识学习路线扼要描述两者之间的共同点&#xff1a;线性运算周期性现象对称性与周期性的关系周期性 预备知识 学习路线 从傅里叶级数&#xff0c;过度到傅里叶变换 扼要描述 傅里叶级数&#xff08;Fourier series&#xff09;&#xff0c;几乎等同于周期性…

面经 | ES6

ES6 ES6Promise对象创建Promise三个状态resolve/reject 和微任务的关系await set vs weakSetmap vs weakMap ES6 Promise对象 new Promise(excutor);excutor是一个函数,会立刻执行;then里的回调函数&#xff0c;会进入微任务队列&#xff1b;then会返回一个新的promise对象aw…

LeetCode 面试经典150题 137.只出现一次的数字II

题目&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 思路&#xff1a; 方法一&#xf…

Java | Leetcode Java题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; class Solution {public int eraseOverlapIntervals(int[][] intervals) {if (intervals.length 0) {return 0;}Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return i…

如何把python(.py或.ipynb)文件打包成可运行的.exe文件?

将 Python 程序打包成可执行的 .exe 文件&#xff0c;通常使用工具如 PyInstaller。这是一个常用的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件&#xff0c;即使没有安装 Python 也能运行。 步骤&#xff1a; 1. 安装 PyInstaller 使用 conda 安…

风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张

风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张 风力发电机叶片表面缺陷识别数据集&#xff08;Wind Turbine Blade Defects Recognition Dataset, WTBDRD&#xff09; 摘要 WTBDRD 是一个专门为风力发电机叶片表面缺陷识别而设计的数据集&#xff0c;旨在为相关领…

HttpServletRequest简介

HttpServletRequest是什么&#xff1f; HttpServletRequest是一个接口&#xff0c;其父接口是ServletRequest&#xff1b;HttpServletRequest是Tomcat将请求报文转换封装而来的对象&#xff0c;在Tomcat调用service方法时传入&#xff1b;HttpServletRequest代表客户端发来的请…

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

FortiGate OSPF动态路由协议配置

1.目的 本文档针对 FortiGate 的 OSPF 动态路由协议说明。OSPF 路由协议是一种 典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由 域是指一个自治系统,即 AS,它是指一组通过统一的路由政策或路由协议互相交 换路由信息的网络。在这个 AS 中,所有的 …

OTTO奥托机器人开发总结

OTTO机器人是一个开源外壳&#xff0c;硬件和软件的桌面机器人项目&#xff0c;非常适合新手研究和拓展。 我一直希望找一个合适的项目入手研究机器人&#xff0c;这种项目最好是软硬件都开源的&#xff0c;可以随着自己的想法无限的扩展和私人订制&#xff0c;做为初学者&…

Vue3:element-plus el-Table列表合计处理显示字符串类型/计算合计数值

需求整理 1.使用element组件库中的 el-table组件实现图上 底部当前页合计的功能。在一般的情况下&#xff0c;只需要计算数值部分的值&#xff0c;因为组件中的方法中处理的就是将值的类型转换成数值类型&#xff0c;像string类型的字符串的话&#xff0c;在进行转换的时候会出…

计算机毕业设计电影票购买网站 在线选票选座 场次订票统计 新闻留言搜索/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

系统功能 ‌在线选票选座‌&#xff1a;用户可浏览电影场次&#xff0c;选择座位并生成订单。‌场次订票统计‌&#xff1a;系统实时统计各场次订票情况&#xff0c;便于影院管理。‌新闻发布与留言‌&#xff1a;发布最新电影资讯&#xff0c;用户可留言互动。‌搜索功能‌&a…