基于比较冒泡排序-时间复杂度O(n^2)

冒泡排序(Bubble Sort)

只操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足让它两互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

eg:对于一组数据 4、5、6、3、2、1

第一次冒泡的过程:经过了 5 次比较,此时 3 已经在正确的位置了,即每一次冒泡在至少有一个位置会调整到最终的位置,对于 6 个数据最多 6 次冒泡完成所有排序
在这里插入图片描述
六次冒泡后的结果:其实这个是可以优化。当某次冒泡操作已经没有数据交换时候,说明已经达到完全有序,不需要执行后续的冒泡操作。
在这里插入图片描述
优化:由于 n 个数据完成排序的次数是小于等于 n 的,所以当在小于 n 次可以完成,那么再冒泡就会多余。所以可以设置一个标志位,当某次冒泡扫描完所有的数后没有发生数据交换说明此时已经排好,直接跳出即可。
在这里插入图片描述
详细代码:

//冒泡排序,n表示数组大小
public void bubbleSort(int[] arr,int n) {
    if(n <= 1) {
        return;
    }
    for (int i = 0; i < n; i++) {            // 第 i 次的冒泡
        // 提前退出冒泡循环的标志位
        boolean flag = false;
        for (int j = 0; j < n-i-1; j++) {    // 第j号位置开始的比较
            if (arr[j] > arr[j+1]) {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                flag = true;
            }
        }
        if (flag == false) {
            break;
        }
    }
}

小结:

  1. 是原地排序算法吗?
    只涉及相邻数据交换操作,只需要常量级临时空间,所以它的空间复杂度为O(1),是一个原地排序法。
  2. 稳定性
    在冒泡排序中,只有交换才可以改变两个元素的前后顺序,为了保证冒泡排序算法的稳定性,当有相邻两个元素胆小相等的时候不做交换,相同大小的数据在排序前后不会改变顺序所以是稳定的。
  3. 时间复杂度
    最好情况:要排序的数据已经是有序的,只需要进行一次冒泡操作,O(n)
    最坏情况:是倒序 如果6 个数就要 6 次冒泡。 O(n^2)
    平均时间复杂度: O(n^2)
  • 平均复杂度就是加权平均期望时间复杂度,分析的时候要结合概率论的知识,会涉及到很多数学推理与计算,所以我们采用另外一种"有序度" 和“逆序度” 来分析。
    有序度:数组中具有有序关系的元素对的个数。有序元素用数学表达式就是这样:
    有序元素对:a[i] <= a[j], 如果 i < j。(找非逆序对)
    在这里插入图片描述
    比如倒序排列的数组,6 5 4 3 2 1 ,有序度就是 0;
    有序数组,比如 1 2 3 4 5 6 ,有序度就是 n*(n-1)/2 也就是15,把这种完全有序的数组的有序度叫作满有序度。并且 逆序度 = 满有序对 - 有序对
    用之前的 4,5,6,3,2,1举例来看,有序元素对 (4,5)(4,6)(5,6) 有序度是 3。满有序度: n*(n-1)/2=15。冒泡排序包含的两个操作元素,比较和交换。每交换一次,有序度就加1.不管算法怎么改交换次数总是确定的,即为逆序度, n*(n-1)/2–初始有序度。此例中就是 15–3=12,要进行 12 次交换操作。

    对于包含 n 个数据的数组进行冒泡排序,平均交换次数是多少呢?最坏情况下,初始状态的有序度是 0,所以要进行 n*(n-1)/2 次交换。最好情况下,初始状态的有序度是 n*(n-1)/2,就不需要进行交换。我们可以取个中间值 n*(n-1)/4,来表示初始有序度既不是很高也不是很低的平均情况。换句话说,平均情况下,需要 n*(n-1)/4 次交换操作,比较操作肯定要比交换操作多,而复杂度的上限是 O(n^2 ),所以平均情况下的时间复杂度就是 O(n^2 )。这个平均时间复杂度推导过程其实并不严格,但是很多时候很实用,毕竟概率论的定量分析太复杂,不太好用。

    4.应用场景:数据规模小且接近有序

猜你喜欢

转载自blog.csdn.net/qq_40488936/article/details/105558986