黑马程序员技术交流社区

标题: 关于冒泡,你来冒冒泡吧。。。。 [打印本页]

作者: 陈志强    时间: 2013-5-7 00:12
标题: 关于冒泡,你来冒冒泡吧。。。。
本帖最后由 陈志强 于 2013-5-8 18:19 编辑
  1. class sort3
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[] arr2={44,4,64,13,8};

  6. for (int a=0;a<arr2.length;a++ )
  7. {
  8. for (int b=0;b<arr2.length-a-1 ;b++ )
  9. {
  10. if (arr2[b]>arr2[b+1])
  11. {
  12. int temp=arr2[b];
  13. arr2[b]=arr2[b+1];
  14. arr2[b+1]=temp;
  15. }
  16. }
  17. System.out.print(arr2[a]+" ");
  18. }

  19. }
  20. }
复制代码
抱歉,很新人的问题,但是很纠结,这样写究竟哪儿写错了,还望各位大神批评,这样的写法对吗?我被结果吓着了,渴求答案,谢谢!

作者: 孙金鑫    时间: 2013-5-7 01:03
  1. class sort3
  2. {
  3. public static void main(String[] args)
  4. {
  5.         int[] arr2={44,4,64,13,8};

  6.         for (int a=0;a<arr2.length;a++ )
  7.         {
  8.                 for (int b=0;b<arr2.length-a-1 ;b++ )
  9.                 {
  10.                 if (arr2[b]>arr2[b+1])
  11.                         {
  12.                         int temp=arr2[b];
  13.                         arr2[b]=arr2[b+1];
  14.                         arr2[b+1]=temp;
  15.                         }
  16.                 }
  17.         }
  18.         for(int x = 0;x<arr2.length;x++)
  19.                 System.out.print(arr2[x]+" ");    //注意这里,你放错位置了,你所放的位置,是外层循环每循环一次,内存循环做比较而改变的内容

  20.         }
  21. }
复制代码

作者: 风乐    时间: 2013-5-7 01:38
冒泡排序是逐次把大数往后置换的,所以确定顺序是从后往前来的,而你打印数据是从前往后打印的,也就是你打印出来的数据顺序其实还没排好,是不确定的,这就导致等打印8的时候因为它比13小被13给置换到前面去了。
作者: 刘兆华    时间: 2013-5-7 05:06
本帖最后由 刘兆华 于 2013-5-7 05:08 编辑
  1. public class Bubblesort {
  2. static void bubblesort(int[] a) {
  3. int temp;
  4. for (int i = 0; i < a.length-1; i++) {//-1是因为最后一个没必要再跟它本身比较
  5.     for (int j = 0; j < a.length-i-1 ; j++) {
  6.         if (a[j] > a[j+1]) {
  7.             temp = a[j];
  8.             a[j] = a[j+1];
  9.             a[j+1] = temp;
  10.   }
  11. }
  12. }
  13. }
  14. }
复制代码
我看到的错误  首先就是会抛出异常   你的最外层的for循环 arr2.length 没有-1  数组角标越界!

作者: zms2100    时间: 2013-5-7 07:45
顶........沙发的解释是对的。
(帮助理解,O(∩_∩)O~)那打印语句不能放在外循环中,因为每次内循环一结束,就打印一次排序后的结果(在第二次的时候,因为在最后面的8还没有被换到应该在的第二个位置,这时是13在这个位置),所以第二次、第三次内循环结束打印的结果就都是13.
LZ本来是想偷懒结果弄巧成拙了,对吧,O(∩_∩)O~。要节省代码可以写高级for循环 :  (这个是视频后面的内容,不知道LZ看到那里了没,当了解吧)
for(int i : arr2)              // int i : 是要遍历的数组或集合(int[] arr2)的返回值类型+ 给返回值的命名,因为循环体中要用到。
{
    System.out.println( i + " ");           //是 i 而不是 arr[1],因为高级for循环每次取出的值是(类似) arr[x]。
}
作者: 兴朗ok    时间: 2013-5-7 09:52
public class SortDemo {
/**
  * @param args
  */
public static void main(String[] args) {
  Demo();
}
private static void Demo() {
  int[] arr2 = { 44, 4, 64, 13, 8 };
  for (int a = 0; a < arr2.length-1; a++) {//外圈是控制循环的次数  
                 //并且这个地方应该让arr2.length 减1    因为在内圈比较的时候b+1就已经达到数组的长度
   for (int b = 0; b < arr2.length - a - 1; b++) {//内圈是控制比较的次数,
                                  //-a是为了让外循环增加一次,内循环参数与比较的元素个数递减
                                     //-1 防止角标越界
    if (arr2[b] > arr2[b + 1]) {//比较,记录住每次比较后的较大的值
     //将较大的数与较小的数位置置换
     int temp = arr2[b];   
     arr2[b] = arr2[b + 1];
     arr2[b + 1] = temp;
    }
   }
  // System.out.print(arr2[a] + " ");  不应该放在这个地方  这个地方是内圈的循环
                             //结束后,则会输出在外圈a=0时 这个位置的数值 因此会出现重复的现象
                            //应该放在外圈循环,等外圈结束后 ,在去遍历取出 则没有问题啦!!
  }
  for (int i = 0; i < arr2.length; i++) {
   System.out.print(arr2[i]+"  ");//注意这里应该将a变成i, 因为a的生命周期在上面的for结束后就结束啦
  }
}
}


作者: 梁海君    时间: 2013-5-7 14:54
哈哈,我也是结合各位大侠的解答才懂,原来外层循环没结束LZ就打印了,受教了
作者: zms2100    时间: 2013-5-7 14:58
梁海君 发表于 2013-5-7 14:54
哈哈,我也是结合各位大侠的解答才懂,原来外层循环没结束LZ就打印了,受教了 ...

O(∩_∩)O~.........其实有时候我们也是看着别人的错误,才发现原来还能这样,O(∩_∩)O~
看得多了,说不定以后可以应付想坑人的面试官,O(∩_∩)O哈哈哈~
作者: 王婷婷    时间: 2013-5-7 18:20
本帖最后由 王婷婷 于 2013-5-7 18:21 编辑

07.for (int a=0;a<arr2.length;a++ )  这里a<arr2.length-1   因为当每次比较到最后一个时,最后一个元素不需要再比较
写一下自己对冒泡排序的理解吧:
取相邻的两个元素比较,如果符合条件则两个元素换位。
在换位的时候要定义一个第三方变量用于记录相对来说大的元素(当然排序的顺序可以是从大到小或从小到大)
还是建议将换位的具体流程用画图的方式表现出来,只要自己动手将排序的流程理清楚,基本上代码也就出来了(呃,我有的时候,虽然能明白流程还是写不出代码)
所以,必要的时候也可以记着理解。

public static void bubbleSort(int[] arr)
        {
                //当每次比较到最后一个时,最后一个元素不需要再比较
                for (int x = 0;x<arr.length-1 ;x++ )
                {
                        //当每比较一次,被比较的元素就会减少1  -x
                        //避免角标越界  -1
                        for (int y = 0;y<arr.length-x-1 ; y++)
                        {
                            //如果arr[y]>arr[y+1],置换位置,
                                if (arr[y]>arr[y+1])
                                {
                                  //定义第三方变量记录最大值,然后换位
                                        int temp = arr[y];
                                       //此时arr[y]>arr[y+1],将两个元素交换位置,将arr[y+1]赋给arr[y],此时y角标位置没有元素
                                        arr[y] = arr[y+1];
                                       //将大值temp放到y角标位置
                                        arr[y+1] = temp;
                                }
                        }
                }
        }        
主函数调用bubbleSort()方法
int[] arr = {3,2,8,5,7,11};
bubbleSort(arr);
作者: 曹睿翔    时间: 2013-5-7 19:29

如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问
作者: 黑马-雷钊    时间: 2013-5-8 14:46
System.out.print(arr2[a]+" ");
这句写错了。数组输出不是这样的。
需要重新定义一个for循环。这种打印也可以叫遍历数组。
for(int x = 0 ; x < arr.length ; x ++) {
         System.out.println(arr[x]);//这样的话你随便传个数组进来for都会从0角标开始打印。一只打到数组的最大角标的时候停。
}
你的排序方法写的是正确的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2