排序算法-冒泡排序(Java实现)

冒泡排序是排序算法的入门算法,算法思想是每次把最小的数字往上浮,完成一趟排序后就可以发现最大的数字被沉底了,然后第二趟第二大的数字也沉底了,就这样依次类推完成排序。
我们来看一组数字
在这里插入图片描述

  1. 我们把这组数字竖起来更符合冒泡的想法
    在这里插入图片描述
  2. 先比较11和3,3比11小,所以3往上浮,完成交换继续与下一个比较
    在这里插入图片描述
  3. 然后比较11和5,完成交换,继续比较
    在这里插入图片描述
    继续比较,交换
    在这里插入图片描述
    … …
    当比较到最后的时候
    在这里插入图片描述
  4. 到这里11这个最大的数字已经沉底了,下面完成第二趟
    在这里插入图片描述
    第二大的数字9已经完成了沉底
    依次类推,我们是9个数字,就得8趟就可以完成排序
    所以外层循环就是我们的趟数,内层循环就是控制相邻两个数字交换
    下面我们来写代码:

代码实现:

public static void bubbleSort(int[] array) {
    int temp = 0;
    for (int i = 0; i < array.length-1; i++) {
        for (int j = 0; j < array.length-i-1; j++) {
            if(array[j] > array[j+1]) {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

下来我们来想另外一个问题,如果我一趟下来没有元素交换,也就是说我的序列本来就是有序的,难道我们还要让代码一次次的判断吗,所以我们队冒泡排序进行优化

冒泡的优化

public static void bubbleSort(int[] array) {
    int temp = 0;
    boolean bool = false;
    for (int i = 0; i < array.length-1; i++) {
        for (int j = 0; j < array.length-i-1; j++) {
            if(array[j] > array[j+1]) {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                bool = true;
            }
        }
        if(!bool) {
            return;
        }
    }
}

只要加上一个标志位来判断一趟循环后会不会发生交换就好了。
因为冒泡排序交换的时候总是和相邻数字进行交换,所以冒泡排序是稳定的

特点:

稳定
经过我们的优化,我们可以知道当待排序列是有序的时候,只需要执行一趟,发现没有交换就可以直接返回了,所以冒泡排序的最优时间复杂度为O(n),最坏时间复杂度也就是待排序列逆序的时候,为O(n2),一般情况下,平均时间复杂度为O(n2)

最优时间复杂度:

O(n)

最坏时间复杂度:

O(n2)

平均时间复杂度:

O(n2)
在该过程中没有借助辅助数组所以空间复杂度为O(1)

空间复杂度:

O(1)

猜你喜欢

转载自blog.csdn.net/weixin_42220532/article/details/88424848