下面你可以获得以下知识
- 了解冒泡排序是什么!
- 知道冒泡排序的思路
- 知道实例代码并且练习
- 有收获记得帮忙点个赞,有问题请指出。
系列文章
- 各种排序算法分析:https://blog.csdn.net/weixin_46635575/article/details/120887010
- 001冒泡排序:https://blog.csdn.net/weixin_46635575/article/details/120912718
- 002选择排序:https://blog.csdn.net/weixin_46635575/article/details/120924632
- 003插入排序:https://blog.csdn.net/weixin_46635575/article/details/120925291
- 004希尔排序:https://blog.csdn.net/weixin_46635575/article/details/120959617
- 005快速排序:https://blog.csdn.net/weixin_46635575/article/details/120966937
- 006归并排序:https://blog.csdn.net/weixin_46635575/article/details/120987410
- 007基数排序:https://blog.csdn.net/weixin_46635575/article/details/120992403
- 008堆排序:https://blog.csdn.net/weixin_46635575/article/details/121012144
一、冒泡排序基本介绍
1、冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前往后(从下标较小的元素开始)依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前往后移动,就像水底的气泡一样向上冒出。
2、冒泡排序的优化思路
因为排序的过程中,各个元素不断接近自己的位置,如果一趟比较下来没有进行交换,就说名顺序有序
,因此要在排序过程中设置一个标志flag判断元素是否进行交换,从而减少不必要的比较。
3、冒泡排序的图解思路
其实就是两个指针,移动来进行判断,然后如此循环进行比较 ,具体思路大致如下:
- 第一轮循环得到最大值
- 第二轮循环得到第二大值
- 第三轮循环得到第三大值
- 第四轮循环得到第四大值
- 总的要进行数组大小减1的词循环
二、冒泡排序代码实现
package cn.mldn;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3,9,-1,10,-2};
//大致过程
//1、第一步就是第一轮排序得到最大值于最后
// for (int i = 0; i < arr.length - ; i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
//2、第二糖就是把倒数第二大的排到倒数第二位
// for (int i = 0; i < arr.length - 1 - 1; i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
//3、第三糖排序,以此内推
//for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
//4、第四次排序,以此内推
//for (int i = 0; i < arr.length - 1 - 1 - 1 - 1 i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
int temp = 0;//零时变量,用来将最大的数值排在最后
for (int i = 0; i < arr.length - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i < arr.length - 1 - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i < arr.length - 1 - 1 -1 - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("hello " + Arrays.toString(arr));
//------------------------------------------------------------------------------------
//根据上面的观察可以知道了撒,可以再用一套循环解决
//好好理解一下、由此可知,他的时间复杂度为O(n*n)
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - 1 - j; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
}
}
三、冒泡排序的优化
1、思路
如果我们发现在某一糖过程中,没有进行一次交换,提前终止
2、代码实现
package cn.mldn;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3,9,-1,10,-2};
//大致过程
//1、第一步就是第一轮排序得到最大值于最后
// for (int i = 0; i < arr.length - ; i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
//2、第二糖就是把倒数第二大的排到倒数第二位
// for (int i = 0; i < arr.length - 1 - 1; i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
//3、第三糖排序,以此内推
//for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
//4、第四次排序,以此内推
//for (int i = 0; i < arr.length - 1 - 1 - 1 - 1 i++) {
// //如果前面的数比后面的数大,则交换
// if (arr[i] > arr[i+1]) {
// temp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = temp;
// }
// }
/*int temp = 0;//零时变量,用来将最大的数值排在最后
for (int i = 0; i < arr.length - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i < arr.length - 1 - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i < arr.length - 1 - 1 -1 - 1; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}*/
System.out.println("hello " + Arrays.toString(arr));
//------------------------------------------------------------------------------------
//根据上面的观察可以知道了撒,可以再用一套循环解决
//好好理解一下、由此可知,他的时间复杂度为O(n*n)
int temp = 0;
boolean flag = false;
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - 1 - j; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
flag = true;//在这里把flag值为true
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
//在内部循环的时候进行查询
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。
break;
} else {
flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续
}
}
System.out.println("world " + Arrays.toString(arr));
}
}
四、将上面的代码封装为一个方法
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3,9,-1,10,-2};
bubbleSort(arr);
System.out.println("world " + Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
//好好理解一下、由此可知,他的时间复杂度为O(n*n)
int temp = 0;
boolean flag = false;
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - 1 - j; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
flag = true;//在这里把flag值为true
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
//在内部循环的时候进行查询
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。
break;
} else {
flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续
}
}
}
}
五、测试一下冒泡排序的时间复杂度
1、代码是实现
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class BubbleSort {
public static void main(String[] args) {
//1、创建80000个数据来测试一下我们的性能
int[] arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i] = (int)(Math.random()*80000);//生成0到80000的数
}
//2、输出时间
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//格式化
String date1Str = simpleDateFormat.format(date1);
System.out.println("排序前的时间" + date1Str);
bubbleSort(arr);
Date date2 = new Date();
String date2Str = simpleDateFormat.format(date2);
System.out.println("排序后的时间" + date2Str);
}
public static void bubbleSort(int[] arr) {
//好好理解一下、由此可知,他的时间复杂度为O(n*n)
int temp = 0;
boolean flag = false;
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - 1 - j; i++) {
//如果前面的数比后面的数大,则交换
if (arr[i] > arr[i+1]) {
flag = true;//在这里把flag值为true
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
//在内部循环的时候进行查询
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。
break;
} else {
flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续
}
}
}
}
2、效果