➢基本介绍
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) , 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果- -趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。
图解:对数据进行从小到大进行排序 4 , 9 , -5, 7, -3
冒泡排序的的演变历程:
每一次的循环过程中不过只是循环的次数减少了,而且这个正好还就是每次减 1.这个时候就可以在外层抱一个for循环,而在里层for循环的判断条件减 1 即可。
具体实现代码如下:而冒泡排序是使用的俩个for循环,对应的时间复杂度就是一个平方阶,即 O(n ^ 2)
public class Bubbling {
public static void main(String[] args) {
int arr[] = { 4, 9, -5, 7, -3 };
// 首先是把最大的数排在最后
int index = 0;// 临时变量
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
// 如果前面的数比后面的大则交换
if (arr[j] > arr[j + 1]) {
index = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = index;
}
}
}
System.out.println("冒泡排序后的数组:" + Arrays.toString(arr));
}
}
在上述代码实现的过程当中如果出现给出的数组本身就是一个有序的序列,而再对其进行循环排序,很显然就浪费了时间,就此可以对上述代码进行修改,加上一个flag变量用于判断这一次循环过程当中是否交换了数据。而每一次交换过数据之后将falg的值设为true,并且在第一层循环当中对flag的值进行判断。
int arr[] = { 4, 9, -5, 7, -3 };
// 首先是把最大的数排在最后
int index = 0; // 临时变量
boolean flag = false; //表示是否进行过交换
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
// 如果前面的数比后面的大则交换
if (arr[j] > arr[j + 1]) {
flag = true;
index = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = index;
}
}
if (!flag) {
// 表示没有交换过,在这个情况下是排序完成了的,跳出循环
break;
} else {
flag = false;// 把falg置为false重新进行循环交换
}
}
将代码使用一个方法进行封装。在上述代码加上一个方法定义即可,在这个方法当中传递一个待排序数组即可。
public static void bubbling(int [] arr){
。。。。。
}
最后我们可以通过代码测试冒泡排序的性能:
先初始化一个80000容量的数组:并且对数组先进行赋值:
int[] arr1 = new int[80000];
for (int i = 0; i < 80000; i++) {
arr1[i] = (int) (Math.random() * 1000000); //生成一个[0,1000000) 的随机数
}
导入时间类:获取时间
Date a= new Date();
SimpleDateFormat SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String a1 = SimpleDateFormat.format(a);
System.out.println("排序前:"+a1);
bubbling(arr1);
Date b= new Date();
String b1 = SimpleDateFormat.format(b);
System.out.println("排序后:"+b1);
可以看到运行的时间基本上是在15秒钟左右: