change 是用来控制循环的,整个while循环是将当前已经输入的n的数据全部从小到大的排序。只有每次在循环里面的有发生数据的交换,change才会被值为1,如果change为0说明数组已经有序了,你是的只需要while(n<0)这样程序也是正确的,但是会增加很多不需要的比较,比如输入的a[j+1]就是最大的数了,没有change的情况下还会执行(n-1)(n-2)/2次比较。
这个算法之中,因为j变量是从小到大开始循环的,当a[j+1] < a[j] 的时候会交换,但是如果a[j+1]同时有小于a[j-1]的,由于j是从小往到的增长,一个
for循环之中,无法再讲a[j+1] (将换后已经移到了a[j]的位置)和a[j-1]惊醒交换, 所以需要多次。
如下面的例子:
已有的数据为: 1 2 4 5
然后输入了 3, 在进入while循环之前数组中的数据为:
1 2 4 5 3
第一次进入while: n = 4
j = 0 时, a[j] = 1 < a[j+1] = 2, 不交换: 1 2 4 5 3
j = 1 时, a[j] = 2 < a[j+1] = 4, 不交换: 1 2 4 5 3
j = 2 时, a[j] = 4 < a[j+1] = 5, 不交换: 1 2 4 5 3
j = 3 时, a[j] = 5 > a[j+1] = 3, 交换: 1 2 4 3 5(change 置为1)
第一交换完,整个数组还不是有序的,需要继续的执行。
第二次进入while:
j = 0 时, a[j] = 1 < a[j+1] = 2, 不交换: 1 2 4 3 5
j = 1 时, a[j] = 2 < a[j+1] = 4, 不交换: 1 2 4 3 5
j = 2 时, a[j] = 4 > a[j+1] = 3, 交换: 1 2 3 4 5(change 置为1)
j = 3 时, a[j] = 4 < a[j+1] = 5, 不交换: 1 2 4 3 5
整个while之后, change为1, 主要再次的进入执行, 检查。
这次由于所以的数已经有排序了
j = 0 时, a[j] = 1 < a[j+1] = 2, 不交换: 1 2 3 4 5
j = 1 时, a[j] = 2 < a[j+1] = 3, 不交换: 1 2 3 4 5
j = 2 时, a[j] = 3 < a[j+1] = 4, 不交换: 1 2 3 4 5
j = 3 时, a[j] = 4 < a[j+1] = 5, 不交换: 1 2 3 4 5
这次完了之后change=0; 不用在继续执行while了。
这样有了change变量控制之后,循环的次数就少多了。