排序算法之冒泡排序

221 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

冒泡排序

  • 冒泡排序的核心思想比较任何两个相邻的项,如果第一个比第二个大,则交换它们
  • 因为元素项向上移动至正确的顺序,就好像气泡升至表面一样,所以叫冒泡排序。

实现

  • 首先,我们声明len用来存储 待排序数组的长度;
  • 接着,开始外层循环,从数组的第一项开始迭代至最后一项。它控制了在数组中经过多少轮排序。(也就是说,数组中的每一项都会经过一轮)
  • 然后,内循环 从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比较。
  • 如果比较的这两项顺序不对,则交换它们。 代码如下:
// 定义待排序数组
let array = [1, 4, 5, 2, 3, 10, 8, 7, 6];

// 定义冒泡排序方法
function bubbleSort() {
    let len = array.length;
    // 记录交换的次数
    let count = 0;
    for(let i = 0; i < len; i++){
        // 内循环至倒数第二位,是因为,外层第一轮循环结束的时候,最后一个元素已经是最大的了,就没必要再参与比较大小了。
        for (let j = 0; j < len - 1; j++) {
            if(array[j] > array[j + 1]) {
                // 交换位置
                let temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
                count++;
            }
        }
    }
}

上述代码已经实现了一个最基本的不在乎性能的冒泡排序,上述代码运行之后会发现,即使数组的某两位顺序已经是正常的了,但是在后续的比较中,它们还是会一直在进行比较,而这是没有必要的。

改进冒牌排序算法

  • 核心思想:从内循环减去外循环已经跑过的轮数,就可以避免内循环中所有不必要的比较。 代码如下所示:
// 其余代码不变
for(let i = 0; i < len; i++) {
    for(let j = 0; j < len - 1 - i; j++) {
        // 其余代码不变
    }
}

写在最后

  • 一般实际项目中,不推荐使用 冒泡算法,它的复杂度是 O(n2);