简单说说冒泡排序的优化

跟着逆战班老师学习,整理了一下冒泡排序程序更优化一些
思路:将数组中的相邻的两个数值进行比较,若后面的数值大于前面的数值,那么这两个数值交换位置,否则不与调换。
以数组[5,4,3,2,1]为例说明一下,

我们定义外层循环次数为j,内部循环次数为i;我们知道数组的索引下标都是从0开始的,所以我们将j与i的初始值也定为0,从0 取值也是为了方便数组内部从arr[0]开始取值进行比较。

j=0 外层的循环第一次循环:

起使数组:5,4,3,2,1
i=0 内部循环第一次比较:45,3,2,1
i=1 内部循环第二次比较:4,35,2,1
i=2 内部循环第三次比较:4,3,25,1
i=3 内部循环第四次比较:4,3,2,15

j=1 外层的循环第二次循环:

起使数组:4,3,2,1,5 ----->也就是上一次外部循环结束后的数组
i=0 内部循环第一次比较:34,2,1,5
i=1 内部循环第二次比较:3,24,1,5
i=2 内部循环第三次比较:3,2,14,5 -----> 此时4与1比较完毕之后,4和5没有必要在执行程序进行比较了

j=2 外层的循环第三次循环:

起使数组:3,2,1,4,5 ----->也就是上一次外部循环结束后的数组
i=0 内部循环第一次比较:23,1,4,5
i=1 内部循环第二次比较:2,13,4,5 ----->此时3与1比较完毕之后,3与4、4和5没有必要在执行程序进行比较了

j=3外层的循环第四次循环:

起使数组:2,1,3,4,5 ----->也就是上一次外部循环结束后的数组
i=0 内部循环第一次比较:12,3,4,5 ----->此时2与1比较完之后,2与3、3与4、4和5没有必要在执行程序进行比较了

 同时外层没有必要在执行一次循环进行1与2的比较了,这样便优化了程序执行的次数。

我们分析一下规律:
整个数组的长度:arr.length=5;
数组内部数值的索引下标为:arr.length-1=4
我们找到这样的规律:外层循环次数最多为 j =(arr.length - 1) - 1 ;内层循环次数最多为 i = (arr.length - 1 ) - 1 - j ;
【注意这里次数取值是0~3】

var arr = [5,4,3,2,1];
        // 外层循环,外层循环次数最多为j=(arr.length-1)-1
        for(var j = 0 ; j <= (arr.length-1) -1 ; j++){
            // 上一次比较出的数值,不参与下一次循环 -j
            // 当次循环的最后一个单元,通过倒数第二个单元,参与比较不参与循环 -1
            for (var i = 0; i <= (arr.length-1) -1 - j ; i++) {
                if (arr[i] > arr[i + 1]) {
                    // 通过数据交换更改数据比较后的位置
                    var middle = 0;
                    middle = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = middle;
                }
            }
        }
        console.log(arr);

输入结果如图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值