冒泡排序如何实现,时间复杂度是多少, 还可以如何改进?

322 阅读1分钟

冒泡算法的原理:
升序冒泡: 两次循环,相邻元素两两比较,如果前面的大于后面的就交换位置
降序冒泡: 两次循环,相邻元素两两比较,如果前面的小于后面的就交换位置\

冒泡排序在平均和最坏情况下的时间复杂度都是O(n^2),最好情况下都是O(n),空间复 杂度是O(1)。 如果给一个排好序的数组,也会执行,白白浪费性能

function maopao(arr){
    const array = [...arr]
    let isOk = true 
    for(let i = 0, len = array.length;i < len - 1; i++){
        for(let j = i + 1; j < len; j++) {
            if (array[i] > array[j]) {
                let temp = array[i]
                array[i] = array[j]
                array[j] = temp
                isOk = false
    }
}
    if(isOk){
        Break
    }
}
    return array
}

时间复杂度分析

针对性能优化后的排序算法来说
最好的情况是本身就是有序的,只需要进行n-1次比较,没有数据交换,时间复杂度为O(1)
最坏的情况是表元素逆序,需要比较 (n-1) + (n-2) + … + 3 + 2 + 1 = n*(n-1)/2次比较,并作等量级的记录移动,所以总的时间复杂度为O(n^2)
总数,冒泡排序平均时间复杂度为O(n^2)

空间复杂度分析

这里的空间复杂度就是指在交换元素是那个临时变量所占的内存空间
最优空间复杂度就是开始元素顺序有序,无交换,无需使用中间变量,则空间复杂度为0
最差空间复杂度就是元素逆序,则空间复杂度为O(n),表示每次交换时中间变量都重新分配内存空间,也可以直接将中间变量定义在for循环外,为O(1)。
平均空间复杂度为O(1)