用Javascript学算法 之 冒泡排序

很久很久之前我就听说过冒泡排序,不要笑话我,我孤陋寡闻,真心现在才知道冒泡排序是怎么回事。

感觉没法用一张图片或者图示来展示这个问题,我要用语言来说。

怎么打比方呢,比方5个小学生排队,从高到矮排队,我们不要用常规的方法去排队,用冒泡排序去排哈。

我们先给每个人编好号,从左往右依次是1-5。 身高依次是 177 183 164 173 188

首先,我们让这几个人相邻的两个进行比较,我们先比较1和2,

(177 183) 164 173 188

比较过后,如果前面的数比后面的数小,那么就将两个数调换位置,如果前面的数和后面的数一样大或者比后面的数大,那么就不调换位置。

形成新的排序方式 183 177 164 173 188,我们叫做新队伍。

我们开始比较新队伍的2和3

183 (177 164) 173 188

按照之前的方式,不需要调换位置,我们继续比较第三个和第四个

177 183 (164 173) 188

按照之前的方式,需要调换位置,新队伍是 177 183 173 164 188

然后继续向后比较

177 183 173 (164 188)

调换位置,结果为 177 183 173 188 164

发现了什么,最矮的人已经被排到了最右边

然后我们用同样的方式继续找出倒数第二矮的。

177 183 173 188 我么你只需要在这四个人当中找

(177 183) 173 188

183 (177 173) 188

183 177 (173 188)

得出 排序 183 177 188 目前我们剩下需要判断的只有这三个人

(183 177) 188

183 (177 188)

得到 183 188 177,再进行最后一次判断

(183 188)

最后我们可以得出的是 188 183 177 173 164

我们观察上面的过程

把这个队伍看做一个数组,整个过程这个数组是在变化的,没进行一次比较,可能就变化一次

我们从大到小排序,每次寻找最小的放在最后面,所以需要寻找4次最小的(剩一个最大),放在最后

在每次寻找的过程中,我们需要对这个实时变化的数组相邻的两个进行比较,从左到有比较

可以看出这是一个双重嵌套循环

var arr = [177,183,164,173,188];

// 数组的长度
var n = arr.length;

// 我们先进行找最小的数放在最后的4次循环
for (var i = 0; i < n - 1; i++) {

    // 两个相邻的进行比较大小,j < n - i 的原因是因为我们把最小的找出来放在最右边了就不需要在进行比较了
    for (var j = 0; j < n - i; j++) {
        if (arr[j] < arr[j+1]) {
            // 定义一个中间变量
            var b = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = b;
        }
    }
}
console.log(arr);

这样 我们就对这个数组从大到小进行排序了