知道何时以冒泡排序结束循环

时间:2013-09-27 01:04:07

标签: java arrays sorting

public class sortem {

/**
 * @param args
 */
private static void sort(int s[], int len){
    boolean swap = true;
    int upperBound = 0;
    while(swap){
        swap = false;
        for(int i=0;i<len-(upperBound+1);i++)
            if(s[i]> s[i+1]){
                int t=s[i];
                s[i]=s[i+1];
                s[i+1] = t;
                swap = true;

            }
        upperBound++;
    }
}
private static void print(int s[], int len){
    for(int i=0;i<len;i++)
        System.out.println(s[i]);

}
public static void main(String[] args) {
    int  size = 10;
    int s[] = new int [size];

    s[0] = 23; s[1] = 34; s[2] = 56; s[3] = 17; s[4] = 61;
    s[5] = 3;  s[6] = 92; s[7] = 44; s[8] = 19; s[9] = 63;
    sort(s, size);
    print(s, size);
}

}

这是我的问题:

upperBound变量在for循环之外且在while循环内,但为什么我需要这个变量。我不确定我是否理解它对for循环的“控制”。当我最初自己写这个时,我没有这个upperBound变量,当我变得大于数组的长度时,我的循环会结束, 像这样:

for(int i = 0; i > len; i++)

它不起作用...有人可以帮我理解这个upperBound变量如何帮助控制循环边界? 我看到第一次运行时它旁边的+1是必要的,但它是否与将upperBound初始化为1而不是0相同?

1 个答案:

答案 0 :(得分:1)

这个想法是第一次执行for循环时,最大的元素最终会在数组的末尾。第二次,第二大元素在结束前的索引处结束,依此类推。

此处指定upperBound变量背后的一点是,在运行循环k次之后,数组中的最后k个元素是k最大的元素,按正确顺序排列。因此,没有必要再次在循环中考虑它们(我们已经知道它们位于正确的位置)。每次我们遍历循环时,另一个元素最终会出现在正确的位置,因此,我们需要考虑的元素少一个(因此循环条件为i < len - (upperBound+1)的原因),我们比较的最后一对元素将是之前的 我们在之前的迭代中放置的元素。)