1 基本思想
冒泡排序就是将待排序的数据元素两两进行比较,每趟比较都将最大(最小)的数沉。所以我们需要定义两个循环,外层循环控制比较的趟数,内层循环控制比较的次数;对于优化的冒泡排序来说:如果前面比较的数字达到了我们的预期--按从大到小或者从小到大,则不必再进行比较,直接将外层循环向后推进即可,不必在比较数值的大小。
2 代码实现
//未优化的冒泡排序
public static void bubbleSort(int[] array){
//外层循环控制比较的趟数
for (int j = 0; j < array.length-1; j++) {
//内层循环控制比较的次数,也就是说:当第一趟循环结束之后,只需要比较前面的数字即可(大数沉底了)
for (int i = 0; i < array.length-1-j; i++) {
int tmp = 0;
//将大数沉底
if (array[i] > array[i+1]){
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
}
}
}
}
//优化后的冒泡排序
public static void bubbleSort(int[] array){
//定义一个变量来确定前面的数字是否是已排序的
boolean swap = false;
//外层循环控制比较的趟数
for (int j = 0; j < array.length-1; j++) {
//内层循环控制比较的次数,也就是说:当第一趟循环结束之后,只需要比较前面的数字即可(大数沉底了)
for (int i = 0; i < array.length-1-j; i++) {
int tmp = 0;
//将大数沉底
if (array[i] > array[i+1]){
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
swap = true;
}
}
//如果没有发生交换,则将外层循环退出
if (!swap){
break;
}
}
}
3 特性总结
- 时间复杂度:未优化-O(N^2) 最优化-O(N)
- 空间复杂度:O(1)
- 稳定性: 稳定