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

来源:互联网 发布:java中重写equals的类 编辑:程序博客网 时间:2024/05/21 20:36

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

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

/** *  */package Sort;/** * @author fanjialiang24012017年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:因为自己经常在看一些算法时,觉得别人如果写的很详细理解起来就很容易。有些写的很模糊,甚至都不会想去看。所以自己在写的时候也是尽量的越详细越好。





原创粉丝点击