浅析冒泡算法

冒泡算法是最基础的算法之一,但是对于新手来说却有些理解难度,因为其用了两个for循环作为嵌套,并且第一层嵌套作为的初始值成为了第二层的判断值。

arr= {2,5,1,8,3,10,7}

对于冒泡算法,有两种习惯。,一种是for(int i=i<length-1;i>0;i–)另一种是for(int i=1;i<length;i++)

无论 选择那种都是将最大的值放在最右侧,所以以后就没有必要再对比最后一位,依次类推第二大放在倒数第二位,没有必要再与倒数第二位比较,。。。

  • for(;;i++)

    首先看代码例如java

    int temp=0
    for(int i =1; i < arr.length; i++) {
    	        for(int j = 0; j < arr.length- i; j++) {
    	            if(arr[j] > arr[j + 1]) {
    	            	 temp = arr[j];
    		                arr[j] = arr[j+1];
    		                arr[j+1] = temp;
    	            }
    	            System.out.println("循环i="+i+" j="+j+Arrays.toString(arr));
    	        }
    	    }
    

    循环i=1 j=0[2, 5, 1, 8, 3, 10, 7]
    循环i=1 j=1[2, 1, 5, 8, 3, 10, 7]
    循环i=1 j=2[2, 1, 5, 8, 3, 10, 7]
    循环i=1 j=3[2, 1, 5, 3, 8, 10, 7]
    循环i=1 j=4[2, 1, 5, 3, 8, 10, 7]
    循环i=1 j=5[2, 1, 5, 3, 8, 7, 10]
    循环i=2 j=0[1, 2, 5, 3, 8, 7, 10]
    循环i=2 j=1[1, 2, 5, 3, 8, 7, 10]
    循环i=2 j=2[1, 2, 3, 5, 8, 7, 10]
    循环i=2 j=3[1, 2, 3, 5, 8, 7, 10]
    循环i=2 j=4[1, 2, 3, 5, 7, 8, 10]
    循环i=3 j=0[1, 2, 3, 5, 7, 8, 10]
    循环i=3 j=1[1, 2, 3, 5, 7, 8, 10]
    循环i=3 j=2[1, 2, 3, 5, 7, 8, 10]
    循环i=3 j=3[1, 2, 3, 5, 7, 8, 10]
    循环i=4 j=0[1, 2, 3, 5, 7, 8, 10]
    循环i=4 j=1[1, 2, 3, 5, 7, 8, 10]
    循环i=4 j=2[1, 2, 3, 5, 7, 8, 10]
    循环i=5 j=0[1, 2, 3, 5, 7, 8, 10]
    循环i=5 j=1[1, 2, 3, 5, 7, 8, 10]
    循环i=6 j=0[1, 2, 3, 5, 7, 8, 10]

for(;;i–)

int temp=0 
for(int i = arr.length-1; i >0; i--) {
	        for(int j = 0; j < i; j++) {
	            if(arr[j] > arr[j + 1]) {
	            	 temp = arr[j];
		                arr[j] = arr[j+1];
		                arr[j+1] = temp;
	            }
	            System.out.println("循环i="+i+" j="+j+Arrays.toString(arr));
	        }
	    }

循环i=6 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=6 j=1[2, 1, 5, 8, 3, 10, 7]
循环i=6 j=2[2, 1, 5, 8, 3, 10, 7]
循环i=6 j=3[2, 1, 5, 3, 8, 10, 7]
循环i=6 j=4[2, 1, 5, 3, 8, 10, 7]
循环i=6 j=5[2, 1, 5, 3, 8, 7, 10]
循环i=5 j=0[1, 2, 5, 3, 8, 7, 10]
循环i=5 j=1[1, 2, 5, 3, 8, 7, 10]
循环i=5 j=2[1, 2, 3, 5, 8, 7, 10]
循环i=5 j=3[1, 2, 3, 5, 8, 7, 10]
循环i=5 j=4[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=2[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=3[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=2[1, 2, 3, 5, 7, 8, 10]
循环i=2 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=2 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=1 j=0[1, 2, 3, 5, 7, 8, 10]

注意

第一种,在第二层for循环中一定要j<arr.length-1。因为只有首次遍历全部的时候才会完整的排序,如果写作j<i

int temp=0 
for(int i =1; i < arr.length-1; i++) {
	        for(int j =0; j < i; j++) {
	            if(arr[j] > arr[j + 1]) {
	            	 temp = arr[j];
		                arr[j] = arr[j+1];
		                arr[j+1] = temp;
	            }
	            System.out.println("循环i="+i+" j="+j+Arrays.toString(arr));
	        }
	    }

循环i=1 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=2 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=2 j=1[2, 1, 5, 8, 3, 10, 7]
循环i=3 j=0[1, 2, 5, 8, 3, 10, 7]
循环i=3 j=1[1, 2, 5, 8, 3, 10, 7]
循环i=3 j=2[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=0[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=1[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=2[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=3[1, 2, 5, 3, 8, 10, 7]
循环i=5 j=0[1, 2, 5, 3, 8, 10, 7]
循环i=5 j=1[1, 2, 5, 3, 8, 10, 7]
循环i=5 j=2[1, 2, 3, 5, 8, 10, 7]
循环i=5 j=3[1, 2, 3, 5, 8, 10, 7]
循环i=5 j=4[1, 2, 3, 5, 8, 10, 7]

可以看出其输出的结果完全报错,所以要理解好其原理的同时,也要对代码实现逻辑要理解清楚

所以冒泡算好需要从其原理入手,注意两点

  • 其核心理论,就是两两对比,将其需要的值放在末端
  • 在嵌套的循环中,一定也是必须低循环次数一定要有多变少,否则其结果绝对会错
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值