0
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 变量,当 i 变得大于数组的长度时,我的循环将结束,如下所示:

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

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

4

1 回答 1

1

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

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

于 2013-09-27T01:10:27.280 回答