前端算法一之冒泡排序Bubble Sort

251 阅读2分钟

什么是冒泡排序

冒泡排序(Bubble sort)有时被称为下沉排序(sinking sort),是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻项,如果它们的顺序不对(升序或降序排列),则将它们交换。重复传递列表,直到不需要交换,这表示列表已排序。

实现思路

以升序排列为例,在每一次循环中,从i=0开始,将相邻的第i项与第i+1项作比较,保证较大的那一项在第i+1位,直到本轮循环结束,保证所有循环遍历元素中的最大值在最后一位。而在下一轮循环比较中,因为所有值的最大值已排在最后,所以不必再做比较。

代码实现

(以升序为例)
//需要比较排序的循环次数
for (let i = 0; i < arrays.length - 1 ; i++) {
    //当前循环内需要比较的次数(每进入一次循环比较次数减1)
    for (int j = 0; j < arrays.length - i - 1; j++) {
    //前一位与后一位与前一位比较,如果前一位比后一位大,交换两位的值
    if (arrays[j] > arrays[j + 1]) {
        const temp = arrays[j];
        arrays[j] = arrays[j + 1];
        arrays[j + 1] = temp;
        }
    }
}

时间复杂度:O(n²)

代码优化

优化原因:如果数组长度为10,那么就要进行10轮遍历比较,时间复杂度为O(n²);如果在进行到第五轮比较时就已经没有要交换的值了,即此时已经是排序完成的状态了,此时再进行新一轮的遍历比较是没有意义的,因为在没有叫唤值的时候应该跳出循环,完成排序。

//需要比较排序的循环次数
for (let i = 0; i < arrays.length - 1 ; i++) {
    //每一轮中比较之后交换的次数初始化为0
    let time = 0
    //当前循环内需要比较的次数(每进入一次循环比较次数减1)
    for (int j = 0; j < arrays.length - i - 1; j++) {
        //前一位与后一位与前一位比较,如果前一位比后一位大,交换两位的值
        if (arrays[j] > arrays[j + 1]) {
            const temp = arrays[j];
            arrays[j] = arrays[j + 1];
            arrays[j + 1] = temp;
            //但凡本轮中有比较之后的值交换即将time值改变
              time = 1
        }
    }
    //如果time值不为0,跳出循环
    if(time !== 0) break
}

时间复杂度:O(n*m)(m<=0)