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

目录

一、冒泡排序的原理

二、动图演示原理

 三、代码实现:

四、优化后的冒泡排序

五、算法演示网站


一、冒泡排序的原理

冒泡排序就是两两交换,第一趟排序可以得到最大值,那么第二趟排序就不用再比较最大值了,同样是两两交换,找出第二大的值。然后经过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次得出第一趟排序之后的结果就是

4576312189

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

4563121789

二、动图演示原理

下面就不一一列举了,给一个更加形象生动的图演示一下:

 三、代码实现:

    public static int[] BS(int [] array){
        int temp;
        for(int i = 0;i<array.length-1;i++){
            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;
                }
            }
        }
        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 - VisuAlgoicon-default.png?t=M85Bhttps://visualgo.net/en中文版:

数据结构和算法动态可视化 (Chinese) - VisuAlgoicon-default.png?t=M85Bhttps://visualgo.net/zh

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

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会洗碗的CV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值