冒泡排序(Bubble Sorting)的基本思想:
通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
冒泡排序应用实例
我们举一个具体的案例来说明冒泡法。我们将五个无序的数:3, 9, -1, 10, -2 使用冒泡排序法将其排成一个从小到大的有序数列。
小结冒泡排序规则
(1) 一共进行 数组的大小-1 次 大的循环
(2)每一趟排序的次数在逐渐的减少
(3)如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化(如第二趟排序(2))
冒泡排序过程代码:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, -2};
//第1趟排序,就是将最大的数排在最后
int temp = 0;//临时变量
for (int i = 0; i < arr.length - 1 -0; i++) {
if (arr[i] > arr[1 + i]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("第1次排序结果:" + Arrays.toString(arr));
//第2趟排序,就是将第2大的数排在导数第2位
for (int i = 0; i < arr.length - 1 -1; i++) {
if (arr[i] > arr[1 + i]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("第2次排序结果:" + Arrays.toString(arr));
//第3趟排序,就是将第3大的数排在导数第3位
for (int i = 0; i < arr.length -1 -1 -1; i++) {
if (arr[i] > arr[1 + i]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("第3次排序结果:" + Arrays.toString(arr));
//第4趟排序,就是将第3大的数排在导数第4位
for (int i = 0; i < arr.length -1 -1 -1 -1; i++) {
if (arr[i] > arr[1 + i]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("第4次排序结果:" + Arrays.toString(arr));
//一共进行数组的大小-1 次 =5-1=4次循环
}
}
冒泡排序代码(循环):
import java.util.Arrays;
public class BubbleSort02 {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, -2};
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第" + (i + 1) + "次排序");
System.out.println(Arrays.toString(arr));
}
}
}
时间复杂度
O(N^2)
冒泡排序优化
如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。
import java.util.Arrays;
public class BubbleSort02 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int temp = 0;
boolean flag = false;//标识符,表示是否进行过交换
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if (flag=false){//如果小循环一次没发生交换,则退出整个大循环
break;
}else {
flag=false;//如果发生交换,则需要重置flag
}
System.out.println("第" + (i + 1) + "次排序");
System.out.println(Arrays.toString(arr));
}
}
}
- 转换成方法的方式,以及程序运行时间检测:
import java.util.Arrays;
public class BubbleSort03 {
public static void main(String[] args) {
int[] arr = new int[8000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 80000);
}
long startTime = System.currentTimeMillis(); //获取开始时间doSomething(); //测试的代码段
bubbleSort(arr);
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
public static void bubbleSort(int[] arr) {
int temp = 0;
boolean flag = false;//标识符,表示是否进行过交换
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if (flag == false) {//如果小循环一次没发生交换,则退出整个大循环
break;
} else {
flag = false;//如果发生交换,则需要重置flag
}
}
}
}