日期:2014-05-20  浏览次数:20885 次

新手问题:关于循环语句执行
自学Java一段时间,看到讲师关于冒泡排序的代码时,顿时头大了:
public class BubbleSortTest
{
public static void bubbleSort(int[] array)
{
for(int i = 0; i < array.length - 1; i++)
{
for(int j = 0; j < array.length - i - 1; j++)
{
if(array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}


}

System.out.println("第" + (i + 1) + "趟排序");

for(int k = 0; k < array.length; k++)
{
System.out.print(array[k] + " ");
}

System.out.println();

}
}



public static void main(String[] args)
{
int[] array = {4, 7, 8, 9, 3, 2};

bubbleSort(array);

}
}
这是我自己写的关于{4,7,8,9,3,2}排序的代码
public class BubbleTest
{
  public static void main(String[] args) 
  {
   
int[] a = new int[]{4, 7,8,9, 3,2};
for(int i = 0; i < a.length - 1; i++)
{
if(a[i] >= a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
 
System.out.println(a[i]);
 
}
 
continue;
 
 
 
 
 
 
}
 
 
 
 
 
 
 
}


我这个绝对的贻笑大方,但是我看了无数次正确的之后,还是一头雾水,我发现问题就有点严重了。
我觉得自己有这几个循环执行的问题始终弄不明白:
1.我是这样认识循环的执行的:当i = 0;开始执行之后,j = 0;开始执行,判断出 4 < 7;跳出循环,执行打印出:第1趟排序;接着继续执行 k = 0;打印出 array[0]就是 4 + 空格,然后换行
这个绝对错,但是正确的是怎么样?请各位高手替我解答啊!
2.关于定义bubbleSort这个类的必要性,为什么不直接写在main后面,如
public class BubbleSortTest
{
public static void main(String[] args)
{
  int[] array = {4, 7, 8, 9, 3, 2};
for(int i = 0; i < array.length - 1; i++)
{
for(int j = 0; j < array.length - i - 1; j++)
{
if(array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}


}

System.out.println("第" + (i + 1) + "趟排序");


System.out.print(array[i] + " ");

System.out.println();

}









}
}
执行之后的结果真是惨不忍睹,但我就是看不出来这么写和正确的有何执行上的差异,请高手替我解答,先谢谢各位了!


------解决方案--------------------
1.第一次判断4>7,结果为false,if块内的语句不执行,也就是不交换4和7的位置,此时for循环并没有结束!i=array.length - 1的时候跳出!此时i还是0!
接着i++,此时比较7>8?,同上;
直到比较到9>3?(i=3),才执行if下面的语句,交换两个位置,数组变成[4,7,8,3,9,2];
然后比较9>2?(i=4),交换,i++,数组变成[4,7,8,3,2,9];
经过上一条语句的i++之后i=5,array.length()=5,满足循环跳出条件,执行第二个打印数组的循环。

2.定义的是bubbleSort这个方法,不是类,类是class...
这是最基本的一个封装,别的方法想用冒泡排序a数组的时候,只需要调用bubbleSort(a)就行了,知道内部是怎么实现的。就像你装一台电脑,少个显示器,直接用已有的显示器而不用自己从零部件开始组装。

建议你多看看基本概念,比如for循环if语句。还有debug是个好工具,可以让你知道方法中的各种数据结构是怎么变化的。

------解决方案--------------------
几天前自己写的冒泡,lz可以参考下。
Java code

//冒泡排序
    public void bubbleSort(T[] t,Comparator<T> c){
        for(int i=0;i<t.length;i++){//有length-1个元素要移动
            for(int j=0;j<t.length-i-1;j++){//从开始位置往后扫描
                if(c.compare(t[j], t[j+1])>0){//如果发现前面元素比后面大
                    T temp=t[j];t[j]=t[j+1];t[j+1]=temp;//就互换
                }
            }
        }
    }

------解决方案--------------------
冒泡排序的算法分析与改进 
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。