排序算法图解(一):冒泡排序与冒泡排序的优化

简介: 文章目录1 冒泡排序简介2 图解算法3 冒泡排序代码实现4 冒泡排序算法的优化写在最后

1 冒泡排序简介

冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的元素逐渐移动到后部,就像水底的气泡一样逐渐从水面冒出来,这就是冒泡名称的由来。



2 图解算法

以将序列{3, 9, -1, 10, -20}从小到大排序为例!

基本思想就是,在每一趟排序实现将最大的数移到序列的最后端!这主要通过比较相邻两个元素实现,当相邻的两个元素逆序的时候,我们就交换它们。


第1趟排序:

第1趟排序共比较了4次,将最大的数10冒泡到了序列的尾部。


第2趟排序:

由于第一趟排序已经将最大是数10给冒泡到了最末端,因此在本次排序中,不需要再比较最后一个元素,故共比较了3次,将子序列(前四个元素)中最大的数9(整个序列中倒数第二大的数)冒泡到了子序列的尾端(原序列的倒数第二个位置)。




第3趟排序:

在第三趟排序时,同理,倒数两个元素位置已经确定,即第一、第二大的数已经排好位置,只需要再将倒数第三大的数确认即可。故比较2次,实现倒数第三大的数3的位置确定。



第4趟排序:

在第四趟排序时,只有第一、第二个元素的位置还不确定,只需要比较一次,若逆序,则交换即可。到此,排序算法完成,原序列已经排序成为一个递增的序列!



小结


一共进行了数组大小-1次趟排序,即外层循环arr.length-1次;

每趟排序进行了逐趟减小次数的比较,即内层循环arr.length-i-1次,i从0依次增加。

3 冒泡排序代码实现

参考代码如下,为了便于观察结果,在循环中添加了相应的输出语句:

import java.util.Arrays;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 冒泡排序
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] array = {3, 9, -1, 10, -20};
        //排序前
        System.out.println("排序前:" + Arrays.toString(array));
        //冒泡排序
        for (int i = 0; i < array.length - 1; i++) {
            System.out.println("第" + (i+1) + "趟排序开始!");
            for (int j = 0; j < array.length - i - 1; j++) {
                //如果前面的数比后面的数大,则交换
                if(array[j] > array[j+1]){
                    //交换
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
                System.out.println("------第" + (j+1) + "趟排序: " + Arrays.toString(array));
            }
            System.out.println("第" + (i+1) + "趟排序完成: " + Arrays.toString(array));
            System.out.println("================================================");
        }
        //输出排序后的结果
        System.out.println("排序后:" + Arrays.toString(array));
    }
}

实现结果


4 冒泡排序算法的优化

举个例子,将待排序的序列改为:{5,1,2,3,4},用以上算法来处理,观察一下结果:


可以发现,当第一趟排序结束的时候,序列已经排序完成: 即将5冒泡到了最后,序列实现了从小到大排序。但是原冒泡排序算法,还是义无反顾的进行了数组大小-1趟排序


因此,我们需要尝试对算法进行优化!

发现:在冒泡排序的过程中,各个元素都在不断的接近自己的位置,如果下一趟比较中没有进行过任何交换,则说明序列已经有序, 则排序算法已经可以返回结果。因此,考虑在排序算法过程中添加一个标志flag判断元素是否进行过交换,以减少不必要的冤种行为!


优化代码如下:

import java.util.Arrays;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 冒泡排序优化
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] array = {5, 1, 2, 3, 4};
        //排序前
        System.out.println("排序前:" + Arrays.toString(array));
        boolean flag = false; //用于标记是否进行了交换,true则说明进行了交换,false表示无
        //冒泡排序
        for (int i = 0; i < array.length - 1; i++) {
            System.out.println("第" + (i+1) + "趟排序开始!");
            for (int j = 0; j < array.length - i - 1; j++) {
                //如果前面的数比后面的数大,则交换
                if(array[j] > array[j+1]){
                    //交换
                    flag = true; //标记进行了交换
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
                System.out.println("------第" + (j+1) + "趟排序: " + Arrays.toString(array));
            }
            System.out.println("第" + (i+1) + "趟排序完成: " + Arrays.toString(array));
            System.out.println("================================================");
            if (!flag){
                //如果没有进行交换则直接退出,说明排序已经完成
                break;
            }else {
                //回退
                flag = false;
            }
        }
        //输出排序后的结果
        System.out.println("排序后:" + Arrays.toString(array));
    }
}

四趟排序,优化成了只需要两趟排序!又是一个不可多得的小技巧!在算法程序题中,flag的设置是一种常用的编程思想,常常用于回溯算法中,小伙伴们要学会举一反三~


相关文章
|
23天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
159 80
|
11天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
13天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
106 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
9天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
8天前
|
算法 决策智能
基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法
本项目基于MATLAB2022A,使用模拟退火(SA)和蚁群优化(ACO)算法求解旅行商问题(TSP),对比两者的仿真时间、收敛曲线及最短路径长度。SA源于金属退火过程,允许暂时接受较差解以跳出局部最优;ACO模仿蚂蚁信息素机制,通过正反馈发现最优路径。结果显示SA全局探索能力强,ACO在路径优化类问题中表现优异。
|
16天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
19天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
20天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
13天前
|
传感器 算法
基于GA遗传优化的WSN网络最优节点部署算法matlab仿真
本项目基于遗传算法(GA)优化无线传感器网络(WSN)的节点部署,旨在通过最少的节点数量实现最大覆盖。使用MATLAB2022A进行仿真,展示了不同初始节点数量(15、25、40)下的优化结果。核心程序实现了最佳解获取、节点部署绘制及适应度变化曲线展示。遗传算法通过初始化、选择、交叉和变异步骤,逐步优化节点位置配置,最终达到最优覆盖率。
|
13天前
|
算法
基于RRT优化算法的机械臂路径规划和避障matlab仿真
本课题基于RRT优化算法实现机械臂路径规划与避障。通过MATLAB2022a进行仿真,先利用RRT算法计算避障路径,再将路径平滑处理,并转换为机械臂的关节角度序列,确保机械臂在复杂环境中无碰撞移动。系统原理包括随机生成树结构探索空间、直线扩展与障碍物检测等步骤,最终实现高效路径规划。

热门文章

最新文章