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相同?
答案 0 :(得分:1)
这个想法是第一次执行for循环时,最大的元素最终会在数组的末尾。第二次,第二大元素在结束前的索引处结束,依此类推。
此处指定upperBound
变量背后的一点是,在运行循环k
次之后,数组中的最后k
个元素是k
最大的元素,按正确顺序排列。因此,没有必要再次在循环中考虑它们(我们已经知道它们位于正确的位置)。每次我们遍历循环时,另一个元素最终会出现在正确的位置,因此,我们需要考虑的元素少一个(因此循环条件为i < len - (upperBound+1)
的原因),我们比较的最后一对元素将是之前的 我们在之前的迭代中放置的元素。)