解析冒泡排序和阐述两种不同冒泡排序的区别

本文通过对比两种不同的冒泡排序实现,详细解释了如何通过改变一个细节(内层循环的初始值)使排序结果从升序变为降序。作者使用Java演示了这两种冒泡排序的过程,并强调了编程中微小差异可能导致的显著不同结果。
摘要由CSDN通过智能技术生成

      今天在学习Javascript的时候有个demo用的是冒泡排序,仔细一看却觉得有的地方不太对。这好像和我用Java写的冒泡排序不太一样啊,看似相同的程序,输出的结果却相反。 

     于是花了点时间仔细研究了下,并复习了冒泡排序的思路,在这里用java 和大家分享下

/**
 * 
 */
package Sort;
/**
 * @author fanjialiang2401
2017年9月18日
 */

public class Test {
public static void main(String[] args) {
	int []s= {23,34,52,1,5};
	for (int i = 0; i < s.length; i++) {
		for (int j =0; j < s.length; j++) {
			if (s[i]>s[j]) {
				int temp=0;
				temp=s[i];
		    		s[i]=s[j];
				s[j]=temp;
			}
		}
		for (int j2 = 0; j2 < s.length; j2++) {
			System.out.print(s[j2]+"  ");
		}
		System.out.println();
	}

}
}


        这是用Java写的第一种冒泡排序的过程和结果,可以看出思路还是很清晰的:

       总共有两层循环,外层循环i从0开始,内层循环从i开始;从第一个数开始一次和后面的数进行比较,如果比后面的数大,就进行相互交换。一次遍历结束,最小的数会出现在最左边。然后从第二个数再开始,把第二小的数再找出来放在最左边。当外层循环结束,排序也就停止了。

       按照上图的思路:

       先是从1开始 这时候i=0,遍历了一遍没有比他更小的了,数组保持不变。

       再从34开始 i=1,23比它小,和23交换,这时候数组变成了 1,23,52,34,5。需要注意的是:这时候的s[i]变         成了23,不再是34了。而且遍历仍在进行,23再和5进行比较。23>5它俩交换。这时候数组变成了上图的第二             行:1,5, 23, 52, 34。

      接下来再从i=2开始,也就是23。23和本身比较,不变,再和34比较,不变,再和52比较,还是不变。遍历完成 

      接下来是34(i=3)。先和自身比较,不变,再和52比较,不变。遍历完成。 

     最后是52(i=4),和自身比较,不变。遍历全部结束,这样就排好序了。


     接下来说说我今天下午遇到的另一种冒泡排序,大家乍眼一看是不是觉得算法和上图的内容是一模一样呢?结果却是截然相反。上面是从小到大排序,底下输出的结果是从大到小。只因为我改了一个字。把内层j的初始值改成了0。这样的一点微小的改变却影响了整个运行过程。下面我们来分析一下:

比较的思路还是一样的:s[i]和s[j]进行比较,如果s[i]比s[j]大,进行相互交换。

  i=0时:s[i]小于其他任何数,不变


  i=1时:s[i]和s[j]比较。注意:这时候的j=0;也就是s[i]要先和s[0]也就是1进行比较。34>1,交换 数组变成了:34,1,52,23,5这时候s[i]变成了1,1继续和其他数进行比较,不变


  i=2时:s[2]也就是52开始比较,先和s[0]比较。52>34,交换。数组变成了 52,1,34,23,5。这时候s[2]变成了        34,34再和s[1]比较。34>1,交换。数组变成了:52,34,1,23,5。这时候再由1进行遍历,1小于任何数,遍         历完没有变化,数组变成了52,34,1,23,5


  i=3时,s[i]为23。23进行遍历,23<52,23<34,不变。23>1,交换。数组变成了52,34,23,1,5再由1进行比较,不变。

  

i=4时。s[i]=5,5<前面的任何数除过1。进行交换,遍历全部完成。数组变成了52,34,23,5,1 即为最后结果


两种方法只差了一个数字。结果却截然相反。这就是程序的魅力。任何细小的差错都会导致可能截然相反的结果。正所谓:失之毫厘,谬以千里。


PS:因为自己经常在看一些算法时,觉得别人如果写的很详细理解起来就很容易。有些写的很模糊,甚至都不会想去看。所以自己在写的时候也是尽量的越详细越好。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值