什么是冒泡排序(Bubble Sort)算法
冒泡排序(Bubble Sort)算法是对重复无序的一组元素依次进行按序排列。
算法实现
简单写法
//冒泡排序 一个含有n个数每次排序n-1次就会变成有序
for (int i = 0; i < arr.length; i++){
//arr.length-1的目的是为了防止数组下标溢出
for (int j = 0; j < arr.length-1; j++) {
//判断前一个数字大于后一个数,然后进行交换
if (arr[j] < arr[j+1]){
//temp的目的设置一个中转参数 ,然后对其进行交换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("排序进行时:"+java.util.Arrays.toString(arr));
}
System.out.println("排序后:"+java.util.Arrays.toString(arr));
优化一
/***
* arr.length-1的目的是为了防止数组下标溢出
* 优化:原来的方法循环次数 是 arr.length*arr.length次,但其实不用这么多不,严重增加了时间复杂度。
* -i 可以专注于比较部分,不需要再排有序部分。
* 单个元素的比较次数只需要进行n-i次,其中i为单个元素的下标
***/
for (int i = 0; i < arr.length; i++){
for (int j = 0; j < arr.length-1-i; j++) {
//判断前一个数字大于后一个数,然后进行交换
if (arr[j] < arr[j+1]){
//temp的目的设置一个中转参数 ,然后对进行交换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("排序进行时:"+java.util.Arrays.toString(arr));
}
System.out.println("排序后:"+java.util.Arrays.toString(arr));
优化二
/***
* arr.length-1的目的是为了防止数组下标溢出
* 优化二:设置一般布尔类型,用来假设此次排序已经有序,可以去除不必要的分支循环比较,减少时间复杂度。
***/
for (int i = 0; i < arr.length; i++){
boolean flag = true;
for (int j = 0; j < arr.length-1-i; j++) {
//判断前一个数字大于后一个数,然后进行交换
if (arr[j] < arr[j+1]){
//temp的目的设置一个中转参数 ,然后对进行交换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
//当进入到if分支循环则是假设失败需要将flag改成false
flag = false;
}
}
//当分支循环结束完,发现flag依然等于true,则表示该循环已经有序不需要在进行循环了
if(flag==true){
break;
}
System.out.println("排序进行时:"+java.util.Arrays.toString(arr));
}
System.out.println("排序后:"+java.util.Arrays.toString(arr));