天下英雄出我辈,一入江湖岁月催。鸿图霸业谈笑间,不胜人生一场醉。
武当山上,一年一度的试道大会又开始了...
众武当弟子摩拳擦掌都想在此次试道大会上一展风采...
张三丰临终前曾留下一句话:试道大会采用冒泡排序....
冒泡思想:每冒泡一轮(外层for循环控制),选出这一轮中最大的数(内层for循环依次两两比较逐步移到最后...)
一共进行arr.length-1轮 (2个比一轮、3个比两轮、悟不出来自己收拾行李快快下山吧,我武当派没有你这样的弟子!)
每轮比较arr.length-1次?(因为每一轮冒泡得到的最大值已经得道成仙无需再比 所以每轮比较arr.length-1-i次)

灵魂版1(实力对决之一个都不能少)

由两位德高望重的裁判主持
主裁判(外层for循环)负责轮数,副裁判(内层for循环)在主裁判的指导下负责每一场比武...
    bubbleSortSoul1 = (arr = []) => {
        let count = 0;
        // i为轮数(因i从0开始 即i<arr.length-1)
        for (let i = 0; i < arr.length - 1; i++) {
            count++;
            // 第i轮仅需比较length-1-i次
            for (let j = 0; j < arr.length - 1 - i; j++) {
                // 这里能不能写成arr[j-1]>arr[j]? 如果有这种特殊癖好 那么j就从1开始吧,然后j<arr.length-i
                if (arr[j] > arr[j + 1]) {
                    let temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        console.log(`bubbleSortSoul1排序完成用了${count}轮`);
        return arr;
    }

灵魂版2(实力对决之换汤不换药)

副裁判突发奇想,竟悟出--心法,每轮比武不再需要主裁判详细指导(不用-i)
    bubbleSortSoul2 = (arr = []) => {
        let length = arr.length - 1;
        let count = 0;
        for (let i = 0; i < arr.length - 1; i++) {
            count++;
            // 这里的length第一轮==arr.length-1-0跟上一版一样
            for (let j = 0; j < length; j++) {
                if (arr[j] > arr[j + 1]) {
                    let temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            // 每一次内层for循环比较完成-1 跟前面的-i一样 换汤不换药
            length--;
        }
        console.log(`bubbleSortSoul2排序完成用了${count}轮`);
        return arr;
    }

灵魂版3(实力对决之副裁判独担重任)

主裁判临时有事请假,大会当头,副裁判迫于压力终悟出冒泡心经,大会依然有序进行...
    bubbleSortSoul3 = (arr = []) => {
        let length = arr.length - 1;
        let count = 0;
        // 单层for循环
        for (let j = 0; j < length; j++) {
            if (arr[j] > arr[j + 1]) {
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
            // 在循环到最大值时候重置j(j=-1到上面j++重置为0)这样可以省了外层for循环
            // 某弟子问:兄dei 这样也行?靠谱不?师傅知道你在瞎搞不?
            // 副裁判:好好比武别废话!冒泡心经!汝辈岂知?
            if (j == length - 1) {
                j = -1;
                length--;
                count++;
            }
        }
        console.log(`bubbleSortSoul3排序完成用了${count}轮`);
        return arr;
    }

没有灵魂版1(flag心法?比武可能提前结束)

师父得知副裁判在主裁判不在的情况下成功举行了一场大会,颇为高兴,决定传一套flag心法给副裁判
此次大会由主裁判弟弟while担任,弟弟毕竟是弟弟,知道的太少了,只能听从安排
副裁判对弟弟说:这样吧,等会比武我微信给你发true你就喊开始,发false你就喊结束,are you OK? 弟弟表示很OK
内幕:部分弟子比武期间被安排得明明白白?比武提前结束...
    bubbleSortNoSoul1 = (arr = []) => {
        let [length, flag, count] = [arr.length - 1, true, 0];
        // 这里用while执行轮数 (也可以用for)
        while (flag) {
            count++;
            // flag心法第一章:他强由他强 清风拂山岗 他横由他横 明月照大江
            // 副裁判准备马上微信给弟弟发false想要结束比武 刚打好没发出去 下面的弟子开始躁动了 干哈呢 比不比了??
            // 好在副裁判有慧根 立即悟出原理(此次比完没有交换就结束吧 再比也没有意义了!)师父果然是师父!佩服!
            flag = false;
            // 大家安静 还是老规矩 继续...
            for (let j = 0; j < length; j++) {
                if (arr[j] > arr[j + 1]) {
                    let temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    // 如果此次循环有交换 则说明还得再来一轮,继续往下比...这轮结束就发true给弟弟
                    flag = true;
                }
            }
            length--;
        }
        console.log(`bubbleSortNoSoul1排序完成用了${count}轮`);
        return arr;
    }

没有灵魂版2(左右互博之术?副裁判得到周伯通真传)

while弟弟被逼做数学题,比大小
副裁判备受周伯通喜欢,习得左右互博之术,并将之发扬光大...
    bubbleSortNoSoul2 = (arr = []) => {
        let [j, temp, left, right, count] = [0, 0, 0, arr.length - 1, 0];
        while (left < right) {
            count++;
            for (j = left; j < right; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            right--;
            for (j = right; j > left; j--) {
                if (arr[j - 1] > arr[j]) {
                    temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
            left++;
        }
        console.log(`bubbleSortNoSoul2排序完成用了${count}轮`);
        return arr;
    }

没有灵魂版3(flag心法+左右互博)

这场比武让副裁判终成一代大侠...
    bubbleSortNoSoul3 = (arr = []) => {
        let [j, temp, left, right, flag, count] = [0, 0, 0, arr.length - 1, true, 0];
        while (left < right && flag) {
            count++;
            flag = false;
            for (j = left; j < right; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            right--;
            for (j = right; j > left; j--) {
                if (arr[j - 1] > arr[j]) {
                    temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                    flag = true;
                }
            }
            left++;
        }
        console.log(`bubbleSortNoSoul3排序完成用了${count}轮`);
        return arr;
    }

测试结果:

    let arr1 = [1, 2, 7, 8, 4, 5, 6, 3, 9];

    console.time('1');
    console.log(bubbleSortSoul1(arr1.concat()));  //8轮
    console.timeEnd('1');
    console.time('2');
    console.log(bubbleSortSoul2(arr1.concat()));  //8轮
    console.timeEnd('2');
    console.time('3');
    console.log(bubbleSortSoul3(arr1.concat()));  //8轮
    console.timeEnd('3');
    console.time('4');
    console.log(bubbleSortNoSoul1(arr1.concat()));//6轮
    console.timeEnd('4');
    console.time('5');
    console.log(bubbleSortNoSoul2(arr1.concat()));//4轮
    console.timeEnd('5');
    console.time('6');
    console.log(bubbleSortNoSoul3(arr1.concat()));//3轮
    console.timeEnd('6');

node环境下测试结果

注:

  • 汝辈岂知。——《三国演义》孔明空城计,司马懿两个儿子要攻城,司马懿:汝辈岂知?宜速退。
  • 他强由他强 清风拂山岗 他横由他横 明月照大江。——出自金庸《倚天屠龙记》里九阳真经。
  • 周伯通。——金庸《射雕英雄传》人物,曾将空明拳和双手互博之术传给郭靖。

JS冒泡排序的6种写法(武当雄风)的更多相关文章

  1. JS面向对象的几种写法

    JS 中,面向对象有几种写法.归纳下,大概有下面这几种:工厂模式,构造函数模式,原型模式,构造函数与原型模式的混合使用,原型链继承,借用构造函数继承. 一.工厂模式 function person ( ...

  2. [JS] 面向对象的5种写法和拓展JS对象的写法

    面向对象的JAVA  最开始当然是对象的定义了 收集了以下的五种写法 //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; C ...

  3. js面向对象的五种写法

    第一种: //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = functio ...

  4. (转载)无缝滚动图片的js和jquery两种写法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. js类的几种写法

    我们常用的有以下几种方法来用JavaScript写一个“类”: 1. 构造函数(public属性和方法) 1: function Person(iName, iAge){ 2: this.name=i ...

  6. JS 定时器的4种写法及介绍

    JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout.setInterval.setImmediate.requestAnimationFrame. 一.什么是定时 ...

  7. js和jquery 两种写法 鼠标经过图片切换背景效果

    这个是javascript的写法 <img src="res/img/shop-c_32.jpg" alt="" onmouseover="th ...

  8. js对象的两种写法

    <script>     //定义一个对象,提供对应的方法或者属性     var s = {         sd1: function () { },         sd2: fun ...

  9. jquery 在页面中三种写法

    jQuery 分 2 个系列版本 1.x 与 2.x,主要的区别在于 2.x 不再兼容 IE6.7.8浏览器,这样做的目的是为了兼容移动端开发.由于减少了一些代码,使得该版本比 jQuery 1.x ...

随机推荐

  1. 防DNS劫持教程,手动修复本地DNS教程

    防DNS劫持教程,手动修复本地DNS教程 该如何避免DNS劫持的问题呢?1. 请不要轻易连接陌生网络.2. 可以通过手动指定DNS(DNS用于将域名正确转换为您想访问的网站的作用),修改后你的网络应用 ...

  2. MySQL数据库----触发器

    触发器-trigger 触发器:监视某种情况,并触发某种操作. 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 -- 触发器:某种程序触发了工具的运行 -- 触发器不能主 ...

  3. MySQL Crash Course #07# Chapter 15. 关系数据库. INNER JOIN. VS. nested subquery

    索引 理解相关表. foreign key JOIN 与保持参照完整性 关于JOIN 的一些建议,子查询 VS. 联表查询 我发现MySQL 的官方文档里是有教程的. SQL Tutorial - W ...

  4. Hadoop MapReduce执行过程实例分析

    1.MapReduce是如何执行任务的?2.Mapper任务是怎样的一个过程?3.Reduce是如何执行任务的?4.键值对是如何编号的?5.实例,如何计算没见最高气温? 分析MapReduce执行过程 ...

  5. linux内核分析 第一周

    计算机是如何工作的 冯·诺依曼理论的要点是: 数字计算机的数制采用二进制:计算机应该按照程序顺序执行. 冯·诺依曼体系结构 根据冯·诺依曼体系结构构成的计算机,必须具有如下功能:把需要的程序和数据送至 ...

  6. Asterisk1.8 转码策略分析

    最近在修改asterisk转码和编码协商的问题,发现asterisk的转码策略的选择还是有些问题的(基于1.8.9.3版本).——————————————相关的CLI命令转码路径的调试命令:core ...

  7. VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例

    转载:http://www.codefans.net/articles/1435.shtml 转载:http://www.cnblogs.com/morewindows/archive/2011/08 ...

  8. 将Sublime Text 添加到鼠标右键菜单的教程方法

    安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...

  9. org.apache.axis2.AxisFault: unknown

    遇到这个异常懵逼了很长时间才解决,axis2框架个人感觉进行接口相互调用还是比较麻烦的, 调了很长时间,我由a项目调用b项目的接口时,一直报这个错,在网上找了很长时间,也没找到 解决的办法,自己慢慢的 ...

  10. js函数事件对象

    每个函数都有4个默认对象 arguments 保存着实际传入的参数,集合列表 return 有两个功能,打断函数和返回函数值 this 谁调用的函数,this就是谁 event 事件对象 事件 box ...