冒泡排序是最常用的排序算法,在笔试中也非常常见,那么何为冒泡排序呢?通俗的来说就是一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。
1.原理:比较两个相邻的元素,将值大的元素交换到右边
2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
…
(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
我们通过一个简单的例子来说明:
3, 1, 6, 2, 9, 0, 7, 4, 5, 8 | 初始序列 |
---|---|
1, 3, 6, 2, 9, 0, 7, 4, 5, 8 | 第一次 |
1, 3, 6, 2, 9, 0, 7, 4, 5, 8 | 第二次 |
1, 3, 2, 6, 9, 0, 7, 4, 5, 8 | 第三次 |
1, 3, 2, 6, 9, 0, 7, 4, 5, 8 | 第四次 |
1, 3, 2, 6, 0, 9, 7, 4, 5, 8 | 第五次 |
1, 3, 2, 6, 0, 7, 9, 4, 5, 8 | 第六次 |
1, 3, 2, 6, 0, 7, 4, 9, 5, 8 | 第七次 |
1, 3, 2, 6, 0, 7, 4, 5, 9, 8 | 第八次 |
1, 3, 2, 6, 0, 7, 4, 5, 8, 9 | 第九次 |
这样一次的循环就可以找到最大的数9,并将它放在最后一位,所以我们可以再到外面套一个循环,依次找到当次循环最大的值。
import java.util.Arrays;
public class TestBubbleSort {
public static void main(String[] args) {
int[] values = {3,1,6,2,9,0,7,4,5,8};
int temp = 0;
for(int i=0;i<values.length-1;i++) {
for(int j=0;j<values.length-1-i;j++) {
//比较大小,换顺序
if(values [j] > values[j+1]) {
temp = values[j];
values [j] = values[j+1];
values [j+1] = temp;
}
System.out.println(Arrays.toString(values));
}
System.out.println("#####");
}
}
}
但是有一点需要我们注意:
我们看到其实序列已经排序好了,但是程序还没有执行完毕,所以为了避免重复,我们对该算法进行优化,我们对整个大循环序列如果都没有发生交换,那么我们就确定序列已经排序好了,就退出循环。
public class TestBubbleSort {
public static void main(String[] args) {
int[] values = {3,1,6,2,9,0,7,4,5,8};
int temp = 0;
for(int i=0;i<values.length-1;i++) {
boolean flag = true;
for(int j=0;j<values.length-1-i;j++) {
//比较大小,换顺序
if(values [j] > values[j+1]) {
temp = values[j];
values [j] = values[j+1];
values [j+1] = temp;
flag = false;
}
System.out.println(Arrays.toString(values));
}
if(flag) {
System.out.println("结束!");
break;
}
System.out.println("#####");
}
}
}
也希望大佬多多指教,小生有礼了!