冒泡排序的理论
什么是冒泡排序呢?如下图,每个圆圈里的数字代表他的大小。
现在五个泡泡是无序的,要把它从大到小或者从小到大排序,就要用到冒泡算法。
拿从小到大排序举例,第一步是霸第一个球3和第二个球5进行比较,如果3比5大,那就交换他俩;如果不是,就不交换。然后,就比较第二个球现在的位置和第三个球,很显然,5比2大,所以交换他俩
然后比5和4,5比四大,所以交换5和4,以此类推,最终第五个位置是最大的。然后,就要从第一个位置开始,重复以上步骤找到第二大的,再重复找第三大的。最终换完的就是从小到大的顺序了
同理,要从小到大排,就是要找出最小的放在后边,然后是第二小、第三小,直到排完。
冒泡排序的代码
从上面的推导可以看出,实际上整个过程是两个循环来完成。外部循环来控制控制要找几次最大值/最小值,内部循环是用来找当前最大值/最小值的。在内部循环里,我们还要判断两个数字大大小以及他们是否要交换数值。在这里就会有人出现一个如下的错误:
a=b;
b=a;
看起来是把a的值赋给b,又把b的值赋给a。但是实际运行过后会发现,a和b都成了b的值。原因是在a给b赋值之前,a的值已经成了b的值。要解决这个问题,就要用到中间变量如下:
int k;
k = a;
a=b;
b=a;
先把a的值赋给k,就不怕a的值丢失了。
如上所述,冒泡排序的代码如下:
public static void maopao(){
int i,j,k;
int[] num = {12,23,43,53,76,13,34,76,34,22};
for (i = 0;i<num.length-1;i++){
for (j=0;j<num.length-1-i;j++) {
if (num[j] < num[j + 1]) {
k = num[j + 1];
num[j + 1] = num[j];
num[j] = k;
}
}
}
for (i = 0;i<num.length;i++){
System.out.print(num[i]);
if(i!=num.length-1){
System.out.print(',');
}
}
}