冒泡排序的学习
第一节 冒泡排序
一、冒泡排序的思想
冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。
二、冒泡排序的思路
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素就是最大的数;
- 排除最大的数,接着下一轮继续相同的操作,确定第二大的数…
- 重复步骤1-3,直到排序完成。
动画演示如下:
资料来源:https://zhuanlan.zhihu.com/p/252631515
三、冒泡排序的实现
代码如下:
//冒泡排序
/*
平均时间复杂度:O(n²)
空间复杂度:O(1)
算法稳定性:稳定
*/
//一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位;
public class BubbleSort1 {
public static void main(String[] args) {
int[] arr = {3,1,4,2,5,7};
bubbleSort1(arr);
//遍历输出结果
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void bubbleSort1(int[] arr){
//如果数组为null或者长度小于2,则无需比较,直接返回
if (arr == null || arr.length < 2){
return;
}
//冒泡排序的核心是比较旁边两个的数,如果左边大于右边的,那么就会交换的右边
//如此反复,一圈下来,最大的数就会跑到最右边。
//最外层的for循环代表的就是这个思想,所以他会有arr.length-1次循环次数
for (int i = 0;i < arr.length - 1;i++){
//内层for循环代表的是在减去已经排好序的个数i,然后再减去1,就可以实现冒泡排序了
//至于为什么要减1,你可以简单的尝试一下,有5个数的话,他们俩俩比较需要几次?
//没错,只需要4次就可以!
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}