JS冒泡排序的6种写法(武当雄风)
天下英雄出我辈,一入江湖岁月催。鸿图霸业谈笑间,不胜人生一场醉。
武当山上,一年一度的试道大会又开始了...
众武当弟子摩拳擦掌都想在此次试道大会上一展风采...
张三丰临终前曾留下一句话:试道大会采用冒泡排序....
冒泡思想:每冒泡一轮(外层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-iif (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环境下测试结果
注:
- 汝辈岂知。——《三国演义》孔明空城计,司马懿两个儿子要攻城,司马懿:汝辈岂知?宜速退。
- 他强由他强 清风拂山岗 他横由他横 明月照大江。——出自金庸《倚天屠龙记》里九阳真经。
- 周伯通。——金庸《射雕英雄传》人物,曾将空明拳和双手互博之术传给郭靖。
转载于:https://www.cnblogs.com/rebirth-csz/p/10530477.html
JS冒泡排序的6种写法(武当雄风)相关推荐
- 冒泡排序及其三种写法
冒泡排序 冒泡排序是入门级的算法,但也有一些有趣的玩法. 通常来说,冒泡排序有三种写法: 一边比较一边向后两两交换,将最大值/最小值冒泡到最后一位: 经过优化的写法:使用一个变量记录当前轮次的比较是否 ...
- 冒泡排序BubbleSort(两种写法)
冒泡排序的核心理念是什么?那就是相邻两数比较,前面的数比后面的数小的话,就交换位置,每次循环找到该次排序的最小值,然后放到该次循环数组的队尾,因此便利到最后,留的就是最大的数. 那么在这里说下冒泡排序 ...
- js面向对象的五种写法
//定义Circle类,拥有成员变量r,常量PI和计算面积的成员函数area() Java代码 //第1种写法 function Circle(r) { this.r = r; } Circle. ...
- java 冒泡排序的三种写法_冒泡排序的三种实现(Java)
冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后. 设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换. (2)这样 ...
- JS面向对象的三种写法
欢迎来我的博客交流 /*面向对象的三种写法 *1.构造函数 *2.class类 * 2.直接操作对象 * */ /**/function myShow(name){this.name = name;t ...
- js冒泡排序的四种方法
更新个基础知识比较简单 仅供参考 //参考排序的数组var arr = [3, 2, 5, 1, 4] 第一种 这种方法冒泡排序 比较相邻的两个元素,如果前一个比后一个大,则交换位置. 第一轮把最大的 ...
- JS 定时器的4种写法及介绍
JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout.setInterval.setImmediate.requestAnimationFrame. 一.什么是定时 ...
- JS 定时器的2种写法及介绍
一:两种定时器 setTimeout() 延迟定时器 setInterval() 循环定时器('间隔器') 定时器中的函数挂载在window对象上,内部的this指向window setTimeou ...
- 基于JS实现回到页面顶部的五种写法(从实现到增强)
为什么80%的码农都做不了架构师?>>> 写法 [1]锚点 使用锚点链接是一种简单的返回顶部的功能实现.该实现主要在页面顶部放置一个指定名称的锚点链接,然后在页面下方放置一个返 ...
最新文章
- Rocksdb 的一些参数调优策略
- 【OpenCV 4开发详解】图像与视频的保存
- ABAP程序打印Spool Request到PDF
- 肖战被抵制?Python爬虫揭秘关于肖战粉丝的人群画像
- C#——银行ATM程序DEMO
- C++ Opengl 多重纹理源码
- orion算法被解密了
- 读取文件慢_页面缓存(Page Cache)-内存和文件之间的那点事儿(下)
- 前端_网页编程 Form表单与模板引擎(上)
- Windows系统(cmd)常用命令
- 4.Unix工作环境
- ios block常见的错误(二)——循环引用
- 基于MRG_MyISAM引擎的Mysql分表
- 聚类分析一:K-MEANS算法
- caffe---测试模型分类结果并输出(python )
- 农行笔试编程题(Java)记录
- 在WINDOWS XP环境下部署基于网络的开源入侵监测平台——snort
- 用R语言下载任意地区DEM数据
- 关于ps cs6的滤镜 (抽出)
- 为什么手机显示itunes store无法连接服务器,iPad无法连接到iTunes Store怎么办?教你几招...