基本介绍
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
图示
代码实现
/***
* @description: 冒泡排序 设计这个算法,首先要先考虑我们要进行几轮比较,就是第一次for循环,(比较length-1轮)
* 接着需要考虑每轮有几次比较,就是第二个for循环
* 其时间复杂度为O(n*n)
* @param: arr
* @return: int[]
* @author ZhangJiaHao
* @date: 2021/12/5 9:41
*/
public static int[] bubbleSort(int arr[]){
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));
}
return arr;
}
代码缺陷
如果一开始就是有序的,这样子无疑会耗费资源,我们可以定义一个标记来标记是否有交换次序,如果没有,就说明这是有序的。
改进
/***
* @description: 方法的优化,就是在一轮中没有进行交换的时候,就说明已经是有序的,我们就不必进行接下来的比较了
* @param: arr
* @return: int[]
* @author ZhangJiaHao
* @date: 2021/12/5 10:19
*/
public static int[] bubbleSort2(int arr[]){
int temp = 0; // 定义中间变量
boolean flag;
for (int i = 0; i < arr.length - 1; i++) {
flag = false; // 标记是否有过交换
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第"+(i+1)+"趟排序结束");
System.out.println(Arrays.toString(arr));
if (!flag){
break;
}
}
return arr;
}
测试
我们使用改进前的方法来测试10万条数据需要花费多少时间进行排序
public static void main(String[] args) {
int arr[] = new int[100000];
for (int i = 0; i < arr.length; i++){
arr[i] = (int)(Math.random()*100000);
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = simpleDateFormat.format(date);
System.out.println("开始前的时间为:"+now);
bubbleSort(arr);
Date date1 = new Date();
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String after = simpleDateFormat.format(date1);
System.out.println("结束后的时间为:"+after);
}