记录一下学习JS函数封装冒泡排序的想法

299 阅读2分钟

记录一下学习函数封装冒泡排序的想法

<script>
    // 利用函数进行冒泡排序
    function sort(arr) {
        for (var i = 0; i < arr.length - 1; i++) {
            console.log('外层执行次数' + i);
            for (var j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    var temp = arr[j]
                    arr[j] = arr[j + 1]
                    arr[j + 1] = temp
                }
                console.log('内层' + j);

            }
        }
        return arr
    }
    var arr1 = sort([18, 43, 35, 22, 32])
    console.log(arr1);
</script>

首先声明一个函数,使用 sort 作为函数名;

小括号内写入一个名为 arr 的形参,用于接收实参传输过来的数组;

接下来在函数内创建第一个 for 循环,用于遍历数组,初始化变量名为 i ,执行条件为 i 小于最高位-1,操作符为i++。

解释一下为什么i要小于最高位-1?

假设一个数组有5个元素,那么需要依次比较两个元素的大小比较4次,才能将所有元素进行都比较到。我们的计数器执行条件是小于自身数组元素长度(最高位)-1,默认长度为5,减去1为4,小于4才能执行所以不包括4,计数器从0开始:0代表第一次循环,1代表第二次循环,2代表第三次循环,3代表第四次循环,4因为不满足执行条件了,所以终止执行循环,此时循环已经执行了4次分别是计数器0、1、2、3.

接下来是里层 for 循环

里层循环使用 j 来作为计数器,从0开始,执行条件为 j 小于数组最高位 - i - 1,j++

解释一下为什么 j 要小于最高位 - i - 1?

上边我们已经知道了需要循环4次才能将所有元素进行都比较到,那么现在里层循环负责的是每次循环时,一个数要和其他数比较几次才能比较完,数组0位和数组1位比,数组1位和数组2位比,数组2位和数组3位比,数组3位和数组4位比,所以得出要对比4次才能比较完。

并且每次比较的次数需要依次减少,切记数组从0位开始比较。

在外层第一次循环时,我们的里层的第一次循环 j < arr.length - i -1; -i(此时的i为0)-1,也就是5-0-1=4

并且 j 还要小于 arr.length - i -1; 也就是 j<4; 有效执行为4次从0开始,0,1,2,3,也就满足了比较所需的次数需求。

\

接下来是if语句, arr[j] >arr[j+1] ,arr[j]代表先从数组的0位开始比较,arr[j+1]代表数组0+1位,也就是arr[j]的后一个元素,如果0位大于0+1位,就使用 转交法(自己想的名字),把0位的元素给临时变量 temp;此时0位上就是空的,再把0+1位给0位,此时0位有了0+1的元素,0+1位为空,再把temp的元素给0+1位,这样就转交完成了。

外层共循环4次,里层根据外层循环的次数,会依次减少自己的循环次数。

最后在函数层内使用return语句 把计算好的arr形参数值给函数名

var arr1 = sort ([18,43,35,22,32])

创建一个新的变量用于储蓄函数结果

最后log 输出结果。

仅用于自己学习---------