6.4 *冒泡排序
冒泡排序是和直接选择排序类似的,每次排序,都确定当前查找范围的最大值(或最小值)。
数组如下:
int arr[]={23,14,56,1,35,89,99,65,73,44};
我们最终要得到一个从小到大排序的数组。
它的算法是这样的:
1.设定初值i=0
2.设定j=0,k=arr.length-i-2(k代表每次循环的长度)
3.看j+1小于k,如果不是,比较a[j]和a[j+1],如果a[j]更大,互换a[j]和a[j+1],进入第4步;如果i已经是最后一个元素,回到第5步;
4.j++,回到第3步
5.i++,如果i不是数组最后一个元素下标,回到第2步,否则算法结束。
为了更好理解k,下面算法第3、4步的具体演示,此时j=0、k=8开始:

条件满足,发生互换,同时j加1,如下图所示:

条件不满足,没有互换,同时j加1,如下图所示:

条件满足,发生互换,同时j加1,如下图所示:

条件满足,发生互换,同时j加1,如下图所示:

条件不满足,没有互换,同时j加1,如下图所示:

条件不满足,没有互换,同时j加1,如下图所示:

条件满足,发生互换,同时j加1,如下图所示:

条件满足,发生互换,同时j加1,如下图所示:

条件满足,发生互换,同时j加1,如下图所示:

我们会发现,j=9的时候已经找到了一个最大值99,并置于正确的位置,这不是偶然的,因为j=8的时候,就已经换好了。
于是k值的意义就很明显了:确定循环下标的上限。第一轮k的值设为8,下一轮循环,j仍然从0开始,但是k变成了7,也就是j只需要递增到7就可以了,这样可以找到第二大的数,然后放在arr.length-2的位置。