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

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

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)


相关文章
|
11天前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
12 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
10天前
|
搜索推荐 C语言
排序算法--冒泡排序
排序算法--冒泡排序
9 0
|
15天前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
15天前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
17天前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
16 0
|
17天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
1天前
|
存储
基于遗传算法的智能天线最佳阵列因子计算matlab仿真
本课题探讨基于遗传算法优化智能天线阵列因子,以提升无线通信系统性能,包括信号质量、干扰抑制及定位精度。通过MATLAB2022a实现的核心程序,展示了遗传算法在寻找最优阵列因子上的应用,显著改善了天线接收功率。
|
4天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
12天前
|
算法
基于粒子群算法的分布式电源配电网重构优化matlab仿真
本研究利用粒子群算法(PSO)优化分布式电源配电网重构,通过Matlab仿真验证优化效果,对比重构前后的节点电压、网损、负荷均衡度、电压偏离及线路传输功率,并记录开关状态变化。PSO算法通过迭代更新粒子位置寻找最优解,旨在最小化网络损耗并提升供电可靠性。仿真结果显示优化后各项指标均有显著改善。
|
7天前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了基于分组卷积神经网络(GroupCNN)和灰狼优化(GWO)的时间序列回归预测算法。算法运行效果良好,无水印展示。使用Matlab2022a开发,提供完整代码及详细中文注释。GroupCNN通过分组卷积减少计算成本,GWO则优化超参数,提高预测性能。项目包含操作步骤视频,方便用户快速上手。

热门文章

最新文章