冒泡排序(Bubble Sort)介绍
很简单的思路,两两比较,将较大值移动到后面,然后继续比下去,这样一轮之后最大值就到最后了。然后取前面的数,继续比较。
思路推演:
1、和简单选择排序同样的两层循环,外层循环控制次数,次数为length - 1,因为最后一个数不需要比较。
2、内层循环依次进行两两比较,并将较大值移往后面,这样一轮循环之后最大值到了最后一位
3、优化一:往前渐进,已经放到最后的就不用再比较了,每次逐个减少内层循环的次数
4、优化二:探测本次内层循环是否有数据交换,如果没有交换,则已经有序,退出外层循环
时间复杂度:
比较次数: 1+2+3+…+(n-1) = n* (n-1) /2 ≈ O(n^2)
交换次数:最少为0,完全逆序的交换为1+2+3+。。。+(n-1)和比较次数相同为n的二次方,选择排序是0-n,冒泡排序是0-n^2,交换操作更占用CPU,所以选择排序效率上优于冒泡排序
经过优化的冒泡排序,在某些场合,可以提前退出循环,这样次数上相对少一些,但是这只是比较的次数,CPU对于比较操作耗时不大,所以这部分区别不大。
稳定性:
只有大于才会交换,等于不会进行任何动作,所以是稳定的
可以实现为稳定的,如果写的不好,也可以是不稳定的
Java代码实现:
public static void main(String[] args){
int[] arr = {10, 1, 4, 2, 8, 3, 5};
System.out.println(Arrays.toString(bubbleSort(arr)));
}
public static int[] bubbleSort(int[] arr){
// 外层循环控制次数
// 循环n - 1次即可
int len = arr.length;
int switchTimes = 0;
for(int i = 0 ;i < len - 1; i++){
switchTimes = 0;
// 从0行进到i的len - i的位置即可,不包括len
for(int j = 0; j < len - i - 1; j++){
if(arr[j] > arr[j + 1]){
swap(arr, j, j + 1);
switchTimes++;
}
}
if(switchTimes == 0){
break;
}
}
return arr;
}
public static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}