冒泡排序和数据结构和算法可视化网站(及其一点小优化)

简介: 【2月更文挑战第5天】


一、冒泡排序的原理
冒泡排序就是两两交换,第一趟排序可以得到最大值,那么第二趟排序就不用再比较最大值了,同样是两两交换,找出第二大的值。然后经过n-1次趟的两两比较之后就可以排序完毕了。

比如说现有数组{4,5,7,9,6,3,1,2,1,8},那么冒泡排序的意思就是

第一趟排序就是现比较4,5,4<5不互换位置,5<7,也不互换位置,7<9,也不用互换位置,9>6,此时6和9互换位置,以此类推,接下来的数字都比9小,都得和9互换位置,总共比较9次,也就是n-1次得出第一趟排序之后的结果就是

4 5 7 6 3 1 2 1 8 9
第二趟排序,由于已经知道最大值了,所以总共比较n-2次即可,得出以下结果:

4 5 6 3 1 2 1 7 8 9
二、动图演示原理
下面就不一一列举了,
image.png

​​

三、代码实现:
public static int[] BS(int [] array){
int temp;
for(int i = 0;iarray[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}

四、优化后的冒泡排序
好了,那现在我们已经知道原理了,能不能做出一点小优化呢,答案是肯定可以的,因为比如说,第一层循环已经固定是length-1次,但是现实生活中有可能不需要排那么多次,在其中排序的过程中就可能已经排好了,此时我们要做的就是消除第一层不必要的排序了。那么我们可以根据if语句是否执行可以判断数组是否已经排好序了,因为如果不执行if语句的话,那肯定是排好序的了,所以此时我们可以在第一层循环里面定义一个标志变量,如果进入if语句就改变该标志变量,第二层循环执行完之后,再判断该标志是否已经被发生变化,如果没有变化,那么就说明已经排好序了,就可以结束循环了。否则,继续进行冒泡排序。

优化后的代码:

public static int[] A_BS(int [] array){
    int temp;
    for(int i = 0;i<array.length-1;i++){
        boolean flag = true;
        for(int j = 0;j<array.length-1-i;j++){
            if(array[j]>array[j+1]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                flag = false;
            }
        }
        if(flag){
            break;
        }
    }
    return array;
}

五、算法演示网站
这里我比较推荐数据结构和算法可视化网站:

英文版:

visualising data structures and algorithms through animation - VisuAlgo
https://visualgo.net/en
中文版:

数据结构和算法动态可视化 (Chinese) - VisuAlgo
https://visualgo.net/zh

里面有很多常见的算法如上图,是一个适合刚刚学算法的小白使用。
image.png

相关文章
|
13天前
|
机器学习/深度学习 算法 新能源
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
|
13天前
|
存储 算法 安全
【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)
【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)
|
13天前
|
机器学习/深度学习 数据采集 算法
【创新无忧】基于白鲨算法WSO优化广义神经网络GRNN电机故障诊断(Matlab代码实现)
【创新无忧】基于白鲨算法WSO优化广义神经网络GRNN电机故障诊断(Matlab代码实现)
|
14天前
|
算法 Java 调度
【车间调度】基于GA、PSO、SA、ACO、TS优化算法的车间调度比较研究(Matlab代码实现)
【车间调度】基于GA、PSO、SA、ACO、TS优化算法的车间调度比较研究(Matlab代码实现)
|
14天前
|
机器学习/深度学习 算法 网络性能优化
【EI复现】基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理(Matlab代码实现)
【EI复现】基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理(Matlab代码实现)
|
15天前
|
机器学习/深度学习 分布式计算 算法
【升级版本】基于多目标粒子群算法的微电网优化调度【风光、储能、柴油、燃气、电网交互】(Matlab代码实现)
【升级版本】基于多目标粒子群算法的微电网优化调度【风光、储能、柴油、燃气、电网交互】(Matlab代码实现)
|
15天前
|
安全 调度 Python
【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)
【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)
|
10月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
212 59
|
3月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
41 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。

热门文章

最新文章