数据结构与算法 - 冒泡排序

126 阅读2分钟

介绍

冒泡排序的思路比较简单,总结下来就是一句话:给你一个数组,如果你能找出其中最大的数,并把它放到这个数组的最后,那么你就能给整个数组排序。

找最大的数-代码实现

function setMaxIndex(source) {
    let max = -Infinity;
    let maxIndex = -1;
    for (let i = 0; i < source.length; i++) {
        if (source[i] > max) {
            max = source[i];
            maxIndex = i;
        }
    }
    
    // 交换
    let temp = source[source.length - 1];
    source[source.length - 1] = source[maxIndex];
    source[maxIndex] = temp;
}

代码结构比较简单,找到最大的数,然后把这个数放到最后即可

排序

如一个数组中存在10个数,第一次找出了最大的数,剩下只需要重复这个动作即可,即找出这9个数中最大的数,然后把最大的数放在这9个数所组成的数组的最后,直到数组的长度为1,排序停止,代码如下

function sort(arr) {
    // 为了更方便的控制数组中的数量,我们对函数做出了一点点小的改变
    function setMaxIndex(source, len) {
        if (len <= 1) return;
        
        let max = -Infinity;
        let maxIndex = -1;
        for (let i = 0; i < len; i++) {
            if (source[i] > max) {
                max = source[i];
                maxIndex = i;
            }
        }

        // 交换
        let temp = source[len - 1];
        source[len - 1] = source[maxIndex];
        source[maxIndex] = temp;
    }
    
    for (let len = arr.length; len > 0; len--) {
        setMaxIndex(arr, len);
    }
    
    return arr;
}

标准的冒泡排序

你可能也发现了,这好像和网上给出的冒泡排序代码不一样,正常的冒泡排序,貌似只需要几行代码就可以了。是的,你可以对比一下两份代码,比较它们实现的思路,会发现,它们的核心内容是一样的,在理解之后,你也可以加上自已定义比较函数【谁排在前面,谁排在后面】,来完善这份代码。

时间复杂度

很明显,代码实际上就是2层循环,以10个数据为例,第一次要执行10次【找最大的数】,第二次要执行9次,最后一次,执行1次,那么总的执行次数就是n + (n - 1) + n(- 2) + …… + 1,最后答案是n * (n + 1) / 2,当n特别大时,我们往往忽略其中的1和2,最后得出的计算次数为n方,我们称时间复杂度为O(n2)【O(n方)】

下一章

快速排序