冒泡排序(Bubble Sort)
是一种计算机科学领域的较简单的排序算法。
冒泡排序算法的原理如下:
1.每一轮从头开始依次比较两个相邻的元素。如第一个比第二个大 , 就交换它们。
2.从开始第一对到结尾的最后一对。每轮下来保证该轮最大的数在最右边。3.重复地进行上面的步骤直到没有相邻元素需要交换。(排序完成)
1.冒泡排序的写法:
@Test
public void test02() {
// 自定义一个数组.
int[] a = {5, 3, 2, 9, 8, 1 , 4};
for (int i = a.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
// 判断?
if (a[j] > a[j + 1]) {
// 交换.
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
System.out.println("i=" + i + " -> " + Arrays.toString(a));
}
}
需要注意的是: a[j] > a[j+1] 如果j<a.length 不减 1 , 就会发生数组索引越界异常!
两个问题:
①最外层循环几轮?
循环几轮: 一般都是倒叙遍历! ( 也就是需要排序的个数 )
②每轮循环的次数:
因为算法的原理 , 每轮下来都会保证该轮最大的数在最右边.
所以我们进行第二轮比较的时候 , 最后两个就无需再进行比较(比较次数-1)
所以我们就使用 j < i ( 因为每轮循环完i-- )
2.冒泡排序的优化.
我们优化的点主要在于:
假如某一轮排序之后已经有序,我们需要减少排序的趟数。( 防止做无用功 )
@Test
public void test03() {
int[] a = {5, 3, 2, 9, 8, 1 , 4};
//添加一个boolean类型的变量 .
boolean flag;
for (int i = a.length - 1; i >= 0; i--) {
flag = false;
for (int j = 0; j < i; j++) {
// 判断?
if (a[j] > a[j + 1]) {
// 交换.
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag=true; //表示交换过
}
}
// 如果没有交换过 , 就直接结束!
if (flag==false){
return;
}
System.out.println("i=" + i + " -> " + Arrays.toString(a));
}
}
运行结果如图: ( 参考没优化的图进行比较 )
优化逻辑: 通过一个布尔变量判断有没有进行数据交换。
如果没有进行交换 , 并且已经排出结果 , 就无需在继续往下执行了.
扫描二维码关注公众号,回复:
9456141 查看本文章