package com.itheima.demo02.Iterator;
import java.util.Arrays;
/*
冒泡排序:
外层循环需要循环数组长度-1
内层循环始终小于数组长度-1-i
外层循环每加1,就能得到一个最大值
优化:
将数字交换的临时变量声明在数组外
定义一个控制变量boolean,控制外层循环的进行
初始值为false,如果当前内循环中发生交换,则证明数组可能仍为无序状态,flag为true,则继续按外层循环
如果当前内循环中未交换,则证明数组已经为有序状态,flag为false,则结束外层循环,打印数组
*/
public class test {
public static void main(String[] args) {
int[] a = new int[10];
for (int i = 0; i < 10; i++) {
a[i] = (int) (Math.random() * 100);
}
int length = a.length;
int temp;
boolean flag;
for (int i = 0; i < length - 1; i++) {
flag = false;
for (int j = 0; j < length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = true;
}
}
if (!flag) {
break;
}
}
System.out.println(Arrays.toString(a));
}
}
复杂度分析
以下是冒泡排序算法复杂度:
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n) | O(n²) | O(1) |
冒泡排序是最容易实现的排序, 最坏的情况是每次都需要交换, 共需遍历并交换将近n²/2次, 时间复杂度为O(n²). 最佳的情况是内循环遍历一次后发现排序是对的, 因此退出循环, 时间复杂度为O(n). 平均来讲, 时间复杂度为O(n²). 由于冒泡排序中只有缓存的temp变量需要内存空间, 因此空间复杂度为常量O(1).
总结与思考
由于冒泡排序只在相邻元素大小不符合要求时才调换他们的位置, 它并不改变相同元素之间的相对顺序, 因此它是稳定的排序算法。