当前位置: 首页 > article >正文

排序算法之选择排序篇

在这里插入图片描述

思想:

每次从未排序的部分找出最小的元素,将其放到已排序部分的末尾

从数据结构中找到最小值,放到第一位,放到最前面,之后再从剩下的元素中找出第二小的值放到第二位,以此类推。

实现思路:

  1. 遍历数据结构,找到最小值,放到第一位
  2. 从剩下的部分找到第二小的值,放到第二位
  3. 重复上述过程,直到整个排序完成

视频实现:

文字描述如上,以下是选择排序的视频全过程

选择排序全过程

代码实现:

接下来是选择排序的代码实现:

 //传入一个数组,用来进行排序  
public static void SelectionSort(int[] arr){  
     //外层循环是用来控制排序的层次的  
     for(int  i = 0 ; i< arr.length-1; i++){  
         int minIndex = i;  
         //内层循环是为了在没有进行排序的元素中找到最小的元素  
         for(int j = i+1 ; j< arr.length;j++){  
             if(arr[j]  < arr[minIndex]){  
                 minIndex = j;  
             }  
         }  
         int temp = arr[i];  
         arr[i] = arr[minIndex];  
         arr[minIndex] = temp;  
     }  
}

外层循环是用来控制排序的层次的 ,所以如下:

for(int i = 0; i < arr.length-1; i++)

内层循环的目的是为了在没有进行排序的元素中找到最小的元素

for(int j = i-1; j < arr.length; j++)

时间复杂度分析:

啊~ 选择排序的时间复杂度嘛,哼哼,这个问题可是很有意思的哦!让我给你详细分析一下,保证你完全明白!(。•̀ᴗ•́。)

选择排序时间复杂度分析:

选择排序的基本思想就是 每次从未排序的部分找出最小的元素,将其放到已排序部分的末尾。它的核心是通过两层循环来完成排序:外层循环控制排序轮次,内层循环负责找最小值。

1. 外层循环的复杂度

外层循环从数组的第一个元素开始,到倒数第二个元素为止。假设数组的长度为 n,那么外层循环的次数就是 n - 1。所以外层循环的复杂度是 O(n)。

2. 内层循环的复杂度

对于每次外层循环,内层循环会从外层循环当前位置之后的元素开始,遍历剩下的所有元素。具体来说:

  • 第一次外层循环:内层循环会从第 1 个元素开始遍历到最后一个元素,总共遍历 n-1 次。
  • 第二次外层循环:内层循环会从第 2 个元素开始遍历到最后一个元素,总共遍历 n-2 次。
  • 第三次外层循环:内层循环会从第 3 个元素开始遍历到最后一个元素,总共遍历 n-3 次。
  • 以此类推……直到最后一次外层循环只遍历一个元素。

所以内层循环的总遍历次数就是:
[
(n-1) + (n-2) + (n-3) + \dots + 1
]
这个和是一个等差数列,我们可以使用等差数列求和公式:
[
S = \frac{n(n-1)}{2}
]
所以内层循环的复杂度是 O(n²)。

3. 总时间复杂度

选择排序的总时间复杂度是外层循环和内层循环的复杂度之和。

  • 外层循环:O(n)
  • 内层循环:O(n²)

因此,选择排序的总时间复杂度是 O(n²)

4. 空间复杂度

选择排序是一个 原地排序算法,意味着它只需要常数级别的额外空间。只用了一个变量 minIndex 来记录最小值的位置,空间复杂度就是 O(1)

总结:

  • 时间复杂度:选择排序的时间复杂度是 O(n²),因为它有两层嵌套循环。
  • 空间复杂度:空间复杂度是 O(1),因为它是一个原地排序,不需要额外的空间。

为什么时间复杂度是 O(n²)?

  • 选择排序每一次外层循环都会执行一次内层循环,内层循环的次数逐步递减,但总体来说,它的时间复杂度是平方级的(O(n²))。

http://www.kler.cn/a/412661.html

相关文章:

  • 【大数据学习 | Spark-SQL】Spark-SQL编程
  • WinForm 的Combox下拉框 在FlatStyle.Flat的边框设置
  • 【Vue】Ego商城项目跟做
  • 使用mingw+CMake在Windows平台编译OpenCV
  • redmi 12c 刷机
  • 利用浏览器录屏
  • GaussDB高智能--智能优化器介绍
  • 【人工智能】Python常用库-PyTorch常用方法教程
  • UE5 fieldSystemActor类
  • UE5 的DOP简化碰撞的基本概念
  • Unity 中 Application 四种常用目录总结
  • golang 定时器的不同任务
  • 单片机main函数执行结束干嘛?
  • YOLO系列论文综述(从YOLOv1到YOLOv11)【第3篇:YOLOv1——YOLO的开山之作】
  • 【深度学习基础】一篇入门模型评估指标(分类篇)
  • Linux 时间属性
  • SurfaceFlinger学习之一:概览
  • 大模型专栏--大模型开发框架
  • Spring | (七)AOP概念及工作流程
  • 【速通GO】数据类型与变量和常量
  • 丹摩 | 基于PyTorch的CIFAR-10图像分类实现
  • 第三方数据库连接免费使用和安装
  • 白光干涉仪:表面粗糙度形貌台阶高测量解决方案
  • Flutter 共性元素动画
  • 工业网络安全 智能电网,SCADA和其他工业控制系统等关键基础设施的网络安全(总结)
  • 无法通过外网连接访问mysql问题排查