从认识冒泡到现在已经4、5年了。按说应该掌握了这个经典排序算法。可是时间一长,就不知道怎么写了。今天认真地反思了一下。只能说自己并没有真正理解冒泡法的实质。这次为了彻底掌握冒泡法,决定先用一个例子,手写一遍整个过程,彻彻底底地看一下它的实质,再从中发现规律,弄明白是如何转化成代码的。
首先假设如下数组 int a[]={10,1,6,5}。将其从小到大排列。冒泡排列是将相邻的两个数进行比较。
下面是整个比较过程。
第一遍:
10 -> 1 -> 6 -> 5
1 -> 10 -> 6 -> 5
1 -> 6 -> 10 -> 5
1 -> 6 -> 5 -> 10
这样最大的数就排到最后一位了。
第二遍:
1 -> 6 -> 5
1 -> 6 -> 5
1 -> 5 -> 6
这样最大的数就排到最后一位了。
第三遍:
1 -> 5
1 -> 5
这样最大的数就排到最后一位了。
整个排序过程就这样,我们从中发现了神马规律了呢?1.比较的遍数(或趟数)等于数组长度-1。2.看每一遍的比较过程发现,是两两比较,两两比较,前者比后者大的话,就交换位置。否则保持不变。代码表示怎么把它转化成代码表述出来呢?就是下面这段代码(Java实现):
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
那每一遍比较到什么时候结束呢?就是j+1等于此遍进行比较的数组的最后一个位置,即j+1=a.length-i时。假设第i遍设为i。则每一遍比较的过程用代码就可表示如下(Java实现):
for(int j=0;j<a.length-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
最后遍历多少遍呢,通过上面的观察so easy 就能看出遍历的次数为数组的长度减一。所以最外面套个for循环即可。
完整的代码如下(Java实现):
int a[]={10,2,3,1,12,34,14,25};
int temp;
for(int i=1;i<a.length;i++){
for(int j=0;j<a.length-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int x : a){ //遍历输出排序后的数组
System.out.println(x+" ");
}
看到这里不知道你是否明白,希望你不要此时明白,过了些日子就不明白了。如果真这样,恐怕你跟我犯的毛病就一样了:只看懂了皮毛,没有好好地钻研。完毕!