- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public class MaoPaoDemo {
// 遍历数组的功能。
public static void printArray(int[] arr) {
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1)
System.out.print(arr[x] + ", ");
else
System.out.println(arr[x] + "]");
}
}
public static void main(String[] args) {
int[] arr = { 34, 19, 11, 109, 3, 56 };
bubbleSort(arr);
printArray(arr);
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/*
* 冒泡排序。
*/
public static void bubbleSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {//控制外循环次数
for (int y = 0; y < arr.length - 1 - x; y++) {//-1是为了避免角标越界异常,-x是为了减少外循环次数
if (arr[y] > arr[y + 1]) {//判断两个相邻元素的大小
swap(arr, y, y + 1);
}
}
}
}
}
输出结果:
其中的实现过程如下表示:
{ 34, 19, 11, 109, 3, 56 }//没有排序之前的数组顺序
执行第一次外循环:
执行内循环,开始第一次排序
34 >19交换位置 { 34, 19, 11, 109, 3, 56 } { 19, 34, 11, 109, 3, 56 }
第二次内循环排序
34 < 11交换位置 { 19, 34, 11, 109, 3, 56 } { 19, 11, 34, 109, 3, 56 }
第三次内循环排序
34 < 109 不交换位置 { 19, 11, 34, 109, 3, 56 } { 19, 11, 34, 109, 3, 56 }
第四次内循环排序
109 > 3 交换位置 { 19, 11, 34, 109, 3, 56 } { 19, 11, 34, 3, 109, 56 }
第五次次内循环排序
109 > 56 交换位置 { 19, 11, 34, 3, 109, 56} { 19, 11, 34, 3, 56, 109 }
............................................................................................................................................................................
执行第二次外循环:
执行内循环,开始第一次排序
19>11 交换位置 { 19, 11, 34, 3, 56, 109 } { 11, 19, 34, 3, 56, 109 }
第二次内循环排序
34 > 3 交换位置 { 11, 19, 34, 3, 56, 109 } { 11, 19, 3, 34, 56, 109 }
第三次内循环排序
34 < 56 不变位置 { 11, 19, 3, 34, 56, 109 } { 11, 19, 3, 34, 56, 109 }
第四次内循环排序
56 < 109不变位置 { 11, 19, 3, 34, 56, 109 } { 11, 19, 3, 34, 56, 109 }
............................................................................................................................................................................
执行第三次外循环:
执行内循环,开始第一次排序
11 < 19 不交换 { 11, 19, 3, 34, 56, 109 } {11, 19, 3, 34, 56, 109 }
第二次内循环排序
19 > 3 交换位置 {11, 19, 3, 34, 56, 109 } {11, 3, 19, 34, 56, 109 }
第三次内循环排序
34 < 56 不交换 {11, 3, 19, 34, 56, 109 } {11, 3, 19, 34, 56, 109 }
............................................................................................................................................................................
执行第四次外循环:
执行内循环,开始第一次排序
11 > 3交换位置 {11, 3, 19, 34, 56, 109 } {3, 11, 19, 34, 56, 109 }
19 < 34 不交换 {3, 11, 19, 34, 56, 109 } {3, 11, 19, 34, 56, 109 }
执行第五次外循环:
执行内循环,开始第一次排序
3 <11 不交换 {3, 11, 19, 34, 56, 109 } {3, 11, 19, 34, 56, 109 }
冒泡排序性能优化:
当某一次遍历没有发生交换,就说明已经遍历好了,就不用再继续迭代了,不必为已经是排序好的顺序继续排序
public class MaoPaoDemo {
// 遍历数组的功能。
public static void printArray(int[] arr) {
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1)
System.out.print(arr[x] + ", ");
else
System.out.println(arr[x] + "]");
}
}
public static void main(String[] args) {
int[] arr = { 2, 1, 3, 4 };
bubbleSort(arr);
printArray(arr);
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/*
* 冒泡排序。
*/
public static void bubbleSort(int[] arr) {
int sum = 0;
int a = 0;
boolean flag = false;
for (int x = 0; x < arr.length - 1; x++) {
for (int y = 0; y < arr.length - 1 - x; y++) {
if (arr[y] > arr[y + 1]) {
swap(arr, y, y + 1);
flag = true;
}
sum++;
System.out.println("内循环排序第----------" + sum+"圈");
if (flag == true) {
a++;
}
}
if (flag == false) {
System.out.println("外循环还剩+++++++++++++++++++++++++++++++" + sum+"圈");
sum = 0;
System.out.println("没有排序");
System.out.println("交换了" + a + "次位置");
break;
}
System.out.println("排序了");
System.out.println("外循环还剩+++++++++++++++++++++++++++++++" + sum+"圈");
sum = 0;
System.out.println("交换了" + a + "次位置");
}
if(sum==0) {
System.out.println("排序完毕,剩余外循环"+sum+"圈");
}
}
}
int[] arr = { 1, 2, 3, 4 }
int[] arr = { 2, 1, 3, 4 }
![](https://i-blog.csdnimg.cn/blog_migrate/eafaca0b70782041b19c2acb764f08fe.png)