冒泡排序的基础算法
冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本素养.
其基本思想是重复的进行整个数组的排序,比较相邻的元素。如果第一个比第二个大就交换他们两个,然后第二个和第第三个相比较,如果前者较大就交换之,否则就不交换,然后又是比较第三个和第四个比较,不断重复,直到找到这个数组中最大的元素,找到最大的元素后删掉,从剩下的元素中,重复这些步骤直到没有任何一对数字需要比较,然后把找到的最大的数按先后顺序存放起来并输出,就是我们所看到的从大到小排序好的数组;
因为它就好像气泡一样,轻的气泡会往上漂浮,在不断漂浮的过程中,发生了两两交换过程,所以叫冒泡排序。
冒泡排序的算法运作如下:
1.比较相邻的元素。如果第一个比第二个大就交换他们两个;
2.对每一对相邻的元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
应对面试排序的口诀记忆法:
N个数字来排序,
两两比较小靠前;
外层循环n-1,
内层循环n-1-i;
package cn.sxt.array2;
import java.util.Arrays;
/**
* 测试冒泡排序以及优化
* @author *佳林
*
*/
public class TestBubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] values = {3,1,2,10,9,0,7,4,5,8};
int temp = 0;
for(int i=0;i<values.length-1;i++) {//因为有j++,索引时会加一,所以要j<values.length-1,使得j++不得超过values.length(即values数组的长度)
//外层循环把剩下的元素中最大的元素找出来
boolean flag = true;//判断循环是否已排好
for(int j=0;j<values.length-1-i;j++) {//values.length-1-i外部没循环一次,内部就少循环一次。
//内层循环找出原数组最大元素
//比较大小,换顺序
if(values[j]>values[j+1]) {//判断条件(比大小),j最大值是9,如果当比较到第9个数时即j=9,对应的values[j+1=10],而values数组下标的最大值是9,就会抛出数组下标越界的异常
temp = values[j];//先把数组values索引为i对应存放的数值(或元素)存入到变量temp中
values[j] = values[j+1];//再把数组values索引为j+1处对应存放的数值,存储到其索引为j的地方
values[j+1] = temp;//最后,把temp存储的值存放到数组values索引为j+1的地方。这样就实现了交换顺序
flag = false;//如果数组元素发生交换说明该数组还没有完全排完
}
System.out.println(Arrays.toString(values));//每比较一次就打印出这个数组
}
if(flag) {//如果flag=true
System.out.println("排序结束!!!");
break;//如果整个内层循环中没有数组的元素发生交换就说明已经排完了,就跳出外层循环
}
System.out.println("-------------------");
}
}
}
运行效果:
可能代码中的注释比较多,但也是为了便于理解!