特点:速度慢,耗时高,但是稳定。工程中基本不用。
和选择排序区别:冒泡排序两两比较大小后都会交换,而选择排序仅仅记录最值的下标,一轮结束后再交换值。冒泡排序稳定,但选择排序不稳定。
思路:重复找子数组中最大数,每次比较后都会交换最大数,最大数逐渐冒泡到顶部。
代码思路:数组内值两两比较,符合条件后交换,再用同样的方法作用于子数组。
方法1:
平均时间复杂度:O(n ^ 2),最好、最坏时间复杂度:O(n ^ 2),两两交换,稳定
private void bubbleSort() {
int[] arrayRandom = new int[100];
int[] arrayRandomCalcul = new int[arrayRandom.length];
Random random = new Random();
for (int i = 0; i < arrayRandom.length; i++) {
arrayRandom[i] = random.nextInt(arrayRandom.length);
}
System.arraycopy(arrayRandom, 0, arrayRandomCalcul, 0, arrayRandom.length);
// 这种方法先将最小的放前面
// for (int i = arr.length-1; i > j; i--) {
// if (arr[i] < arr[i - 1]) swap(arr, i, i - 1);
// }
// }
// 这种方法先将最大的放后面
for (int i = arrayRandomCalcul.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arrayRandomCalcul[j] > arrayRandomCalcul[j + 1]) {
swap(arrayRandomCalcul, j, j + 1);
}
}
// logger.info(JSON.toJSONString(arrayRandomCalcul));
}
logger.info(String.valueOf(isRight(arrayRandom, arrayRandomCalcul)));
}
private boolean isRight(int[] arrOri,int[] arrCal){
Arrays.sort(arrOri);
for (int i = 0;i < arrOri.length;i++){
if (arrOri[i] != arrCal[i]) return false;
}
return true;
}
优化方法:
平均、最坏时间复杂度:O(n ^ 2),最好时间复杂度:O(n ),稳定
??