十大经典排序算法详解(一)冒泡排序,选择排序,插入排序(下)

简介: 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序(下)

3.2-选择排序


算法思想:

选择排序的重点就是选择,选择的方式就是每次循环选出最小的元素,然后将最小的元素与排序序列中的队头元素进行置换.还是老样子,通过下面的图来让大家更好的理解这一个选择的过程:


20210120094142756.png


这是我们基本就能理解选择排序的基本概念.这里我们需要和上面的冒泡排序区分一点的就是,选择排序在比较结束之后并不会直接交换两个元素的位置,只是记录当前序列中的最小元素 ,当找到最小的元素之后,在将该最小元素与队头的元素进行置换.

了解完这些之后,我们也来稍微说一下选择排序的特点:


每次循环必定能够确定一个元素的最终位置,这一点和冒泡排序是一样的

选择排序也是不稳定的,这里大家可能会不理解,还是老样子我们还是通过下面的图来掩饰一下大家就懂了:


20210120145818365.png


算法图解:


20210119161854778.gif


示例代码:


public static void main(String[] args) {
    int []num ={7,4,9,3,2,1,8,6,5,10};
    long startTime=System.currentTimeMillis();  
    for(int i=0;i<num.length-1;i++) {
      int min=i;
      for(int j=i+1;j<num.length;j++) {
        if(num[min]>num[j]) {
          min=j;
        }
      }
      if(i!=min) {
        int temp=num[i];
        num[i]=num[min];
        num[min]=temp;
      }
      System.out.print("第"+(i+1)+"次排序结果:");
      for(int j=0;j<num.length;j++)
        System.out.print(num[j]+" ");
      System.out.println();
    }
    long endTime=System.currentTimeMillis(); 
    System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); 
  }

20210120100617475.png


复杂度分析:


理解完选择排序的基本思想之后,我们就需要来分析一下他的时间复杂度,空间复杂度.


时间复杂度

时间复杂度我们从两个方面来评判


平均情况

平均情况下我们的算法复杂度主要就是在进行元素的比较的过程.即进 if(num[min]>num[j])的过程,这个过程平均下来就是我们两层for循环的次数,这个我们计算一下就能得出是n*(n-1)/2,我们去最大的次数,可以看到时间复杂度就是O(n*n)

最坏情况

最坏情况本质上和我们的平均情况是一样的,因为不管是平均情况还是最坏情况,都是只在最后置换最小元素与队头元素的位置,比较的次数也是一样的,所以这样算下来时间复杂度也是O(n*n)

空间复杂度


这个我们也可以看到我们整个排序的过程中值增加了两个个空间,这个空间就是我们定义的temp和min,所以选择排序的空间复杂度也是常量级别的即为O(1)


3.3-插入排序


算法思想:

插入排序的算法思想则是将整个序列划分成两段,一段时已经排序完成的序列,另一端序列则是仍然无需的状态.就比方下图所示:


20210120151413621.png


分成这样两个序列之后,插入序列每次都是挑选待排序序列的队头元素插入到已有序的序列之中,从有序序列的队尾开始比较,如果比该元素大的话,将该元素后移,一旦出现小于该元素的元素,插入当前的位置.这个就是插入排序名字的由来.


说了半天大家可能还是不太了解,还是通过下面的图来详细讲解一下该算法的执行过程吧:


20210120152753782.png


理解完插入排序算法的基本思想之后我们再来看看该算法的特点:


这个其实不算特点,只是和上述两个算法对比之后,大家可以发现该算法不像上面的冒泡与选择排序一样,每次循环排序都能确定一个元素的最终位置.插入排序每次循环排序之后是不能够唯一确定一个元素的最终位置的.他只能是每次循环之后确定一些元素的相对位置.

插入排序和冒泡排序一样也有一个极端的排序情况,但是冒泡排序的极端情况是最惨的情况,但是插入排序的极端情况就是最爽的情况.就是在序列已经基本有序的时候,插入排序是最快的,时间复杂度可以达到O(n)即线性级别.因为一旦序列有序之后,for循环仍然需要执行,但是在while循环里面就根本不用执行了,这就是插入排序能够达到线性级别的关键.对比冒泡和选择排序,他们都是通过两层for循环进行的,但是插入排序的第二层循环是通过while并且有相应的终止条件,这就使得插入排序的性能比上面两者会相对好一点.当然了,这种情况只存在于序列已经基本有序的情况.

算法图解:


2021011916190625.gif


示例代码:


public static void main(String[] args) {
    int []num ={7,4,9,3,2,1,8,6,5,10};
    long startTime=System.currentTimeMillis();  
    for(int i=1;i<num.length;i++) {
      int temp=num[i];
      int j=i;
      while(j>0&&temp<num[j-1]) {
        num[j]=num[j-1];
        j--;
      }
      if(j!=i) {
        num[j]=temp;
      }
      System.out.print("第"+i+"次排序结果:");
      for(int k=0;k<num.length;k++)
        System.out.print(num[k]+" ");
      System.out.println();
    }
    long endTime=System.currentTimeMillis(); 
    System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); 
  }


20210120101309625.png

复杂度分析:


理解完插入排序的基本思想之后,我们就需要来分析一下他的时间复杂度,空间复杂度.


时间复杂度

时间复杂度我们从三个方面来评判,这里就必须要提一下我们上面所说的极端情况了


最佳情况

时间复杂度能够达到线性级别O(n)

平均情况

平均情况下我们的算法复杂度主要就是在进行元素的比较的过程.即进 temp<num[j-1]的过程,这个过程平均下来就是我们一层for循环的次数以及一层while循环,这个我们计算一下就能得出是n*(n-1)/2,我们去最大的次数,可以看到时间复杂度就是O(n*n)

最坏情况

最坏情况本质上和我们的平均情况是一样的,因为不管是平均情况还是最坏情况,都是只比较的次数也是一样的,所以这样算下来时间复杂度也是O(n*n)

空间复杂度


这个我们也可以看到我们整个排序的过程中值增加了两个个空间,这个空间就是我们定义的temp和j,所以选择排序的空间复杂度也是常量级别的即为O(1)


相关文章
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
148 67
|
3月前
|
搜索推荐
冒泡排序算法
【10月更文挑战第19天】冒泡排序是一种基础的排序算法,虽然在实际应用中可能不是最优的选择,但对于理解排序算法的基本原理和过程具有重要意义。
|
3月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
28 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
3月前
|
搜索推荐 C语言
排序算法--冒泡排序
排序算法--冒泡排序
28 0
|
3月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
4天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
|
13天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
14天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
14天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。

热门文章

最新文章