- 基本思想: 冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。
- 直观表达,每一趟遍历,将一个最大的数移到序列末尾。
图解
代码展示
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {3,9,-1,10,-2};
boolean flag = false;
int n = arr.length;
int temp = 0;
for(int i = 0 ;i < n - 1; i++) {
for(int j = 0; j < n - i - 1; j++) {
if(arr[j] > arr[j+1]) {
flag = true;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
if(!flag) {
break;
} else {
flag = false;
}
System.out.println("第"+(i+1)+"次排序的结果为:");
System.out.println(Arrays.toString(arr));
}
}
}
运行结果
复杂度
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:稳定
接下来创建一个存放80000个随机数的数组来计算排序所需要运行的时间
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
// int arr[] = {3,9,-1,10,-2};
int arr[] = new int[80000];
for(int i = 0; i < 80000; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy--MM--dd HH:mm:ss");
String date1Str = simpleDateFormat.format(date1);
System.out.println("排序前的时间是"+date1Str);
boolean flag = false;
int n = arr.length;
int temp = 0;
for(int i = 0 ;i < n - 1; i++) {
for(int j = 0; j < n - i - 1; j++) {
if(arr[j] > arr[j+1]) {
flag = true;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
if(!flag) {
break;
} else {
flag = false;
}
// System.out.println("第"+(i+1)+"次排序的结果为:");
// System.out.println(Arrays.toString(arr));
}
Date date2 = new Date();
String date2Str = simpleDateFormat.format(date2);
System.out.println("排序后的时间是"+date2Str);
}
}
结果展示:
我们发现冒泡排序排序8000个数的效率并不是很高。
最后
此文若有出入,请指出!
`