描述
a、冒泡排序,是通过每一次遍历获取最大/最小值
b、将最大值/最小值放在尾部/头部
c、然后除开最大值/最小值,剩下的数据在进行遍历获取最大/最小值
d、代码实现
代码
/**
*冒泡排序改进版
*/
public static void main(String[] args) {
// int[] arr = {3, 9, -1, 10, -2};
int[] arr = { 3, 9, -1, 10, 230, 21 };
// 交换变量
// int temp;
// 判断上一次是否进行了排序,若上次没有进行排序,证明排序已经提前完成,可提前跳出循环,结束排序
boolean flag = false;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (!flag) {
break;//这里break跳出程序后,下面的代码就不执行了
//实际上这时:i+1=3
} else {
flag = false;
}
System.out.println("第" + (i + 1) + "次排序");
System.out.println(Arrays.toString(arr));
}
}
性能
时间复杂度:
最好时间复杂度:o(n) (即使排序好,程序也不知道,必须进行一次判断)
最坏时间复杂度:O(n^2)
通常说冒泡的时间复杂度就是:O(n^2)
空间复杂度:
对于空间复杂度来说,插入排序用到的额外的存储空间只有一个,那就是用于交换位置的临时变量,其他所有操作都是在原有待排序列上处理的,所以空间复杂度为 O(1)。