实现数组排序的算法很多,其中冒泡算法是比较简单的
冒泡的基本原理是相邻的两个数进行比较,按照排序的条件进行互换,例如对数值从小到大排序,
随着不断的互换,最大的那个值会慢慢冒泡到数组的末端
基于这个原理我们就可以写冒泡排序了

为了简单起见下面的例子都是对数值数组进行从小到大排序,先模拟一个20个字符的数组

function getRandomArr(n) {
let arr = [];
for (let i = 0; i < n; i++) {
arr.push(~~(Math.random() * 100));
}
return arr
}
let randomArr = getRandomArr(20);

第一种冒泡算法
从原理可知,冒泡算法最少是需要2层循环的,当其中一个数值冒泡到末端时,这个数值下次就不需要参与循环了,这样循环的范围就会慢慢缩小,最后数组完成排序

function bubbleSort(arr) {
let len = arr.length;
let temp;
let i = len - 1;
while(i > 0) {
for (let j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
i--;//不断缩小范围
}
return arr;
}
console.log(randomArr)//[ 93, 72, 29, 17, 82, 26, 56, 71, 35, 48, 37, 42, 3, 11, 33, 66, 81, 53, 59, 53 ]
console.log('bubbleSort', bubbleSort(randomArr.concat()));//bubbleSort [ 3, 11, 17, 26, 29, 33, 35, 37, 42, 48, 53, 53, 56, 59, 66, 71, 72, 81, 82, 93 ]

在冒泡的过程中,我们可以发现,如果数组后面部分已经排好序了,也就是不用再交换双方的位置时,只要记录好最后一次交换的位置,就有很大的可能缩小下次循环的范围,这样就能提高冒泡的性能(这只是猜想)
第二种冒泡算法

function bubbleSort2(arr) {
let len = arr.length;
let i = len - 1;
let temp;
let pos;//用来记录位置的
while (i > 0) {
pos = 0;//初始为0如果数组一开始已经排好序了,那么就可以很快终止冒泡
for (let j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
pos = j;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
i = pos;
}
return arr;
}
console.log(randomArr)//[47, 31, 85, 65, 44, 56, 54, 5, 67, 44, 76, 13, 90, 12, 83, 72, 2, 69, 58, 60]
console.log('bubbleSort2', bubbleSort2(randomArr.concat()));//bubbleSort2 [2, 5, 12, 13, 31, 44, 44, 47, 54, 56, 58, 60, 65, 67, 69, 72, 76, 83, 85, 90]

其实对于第一种循环,是从左到右进行冒泡,我们也可以从右到左冒泡,但是从右到左的方法和第一种基本就一样了,但是我们可以在内层循环中实现先向左冒泡,再向右冒泡
第三种冒泡方法

function bubbleSort3(arr) {
let len = arr.length;
let low = 0;
let higth = len - 1;
let temp;
while (low < higth) {
for (let j = low; j < higth; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
higth--;
for (let j = higth; j > low; j--) {
if (arr[j] < arr[j - 1]) {
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
low++;
}
return arr;
}
console.log(randomArr)//[40, 78, 16, 97, 38, 27, 66, 44, 45, 31, 12, 1, 99, 68, 36, 42, 40, 54, 6, 42]
console.log('bubbleSort3', bubbleSort3(randomArr.concat()));//bubbleSort3 [1, 6, 12, 16, 27, 31, 36, 38, 40, 40, 42, 42, 44, 45, 54, 66, 68, 78, 97, 99]

最后可以结合第三种和第二种方法
第四种冒泡的方法

function bubbleSort4(arr) {
let len = arr.length;
let low = 0;
let higth = len - 1;
let temp;
while (low < higth) {
let hPos = 0;
let lPos = higth;
for (let j = low; j < higth; j++) {
if (arr[j] > arr[j + 1]) {
hpos = j;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
heigth = hPos;
for (let j = higth; j > low; j--) {
if (arr[j] < arr[j - 1]) {
lPos = j;
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
low = lPos;
}
return arr;
}
console.log(randomArr)//[40, 78, 16, 97, 38, 27, 66, 44, 45, 31, 12, 1, 99, 68, 36, 42, 40, 54, 6, 42]
console.log('bubbleSort4', bubbleSort4(randomArr.concat()));//[1, 6, 12, 16, 27, 31, 36, 38, 40, 40, 42, 42, 44, 45, 54, 66, 68, 78, 97, 99]

下面对这4种方法在chrome控制台下进行一个简单的性能测试

var randomArr = getRandomArr(10000);
console.time('1');
bubbleSort(randomArr.concat());
console.timeEnd('1');
console.time('2');
bubbleSort2(randomArr.concat());
console.timeEnd('2');
console.time('3');
bubbleSort3(randomArr.concat());
console.timeEnd('3');
console.time('4');
bubbleSort4(randomArr.concat());
console.timeEnd('4');
VM371:4 1: 329.705ms
VM371:7 2: 379.501ms
VM371:10 3: 310.843ms
VM371:13 4: 306.847ms

在经过多次测试发现一个有趣的现象执行最快的是第4种方法,最慢的是第2种,没错最慢的是我认为可以提高性能的第2种方法,这就相当尴尬了,不知道有哪位小伙伴可以解释一下

js数值排序中冒泡算法的4种简单实现的更多相关文章

  1. JS去除数组中重复值的四种方法

    JS去除数组中重复值的四种方法 1 /// <summary>            o[this[i]] = "";  }      }       newArr.p ...

  2. JS基础入门篇( 三 )—使用JS获取页面中某个元素的4种方法以及之间的差别( 一 )

    1.使用JS获取页面中某个元素的4种方法 1.通过id名获取元素 document.getElementById("id名"); 2.通过class名获取元素 document.g ...

  3. Js 在页面中输入消息的几种方式

    一.方式 alert(“”); confirm(“”) ; prompt(“”);         接收用户信息 console.log(“”);      在网页控制台中输出消息 document. ...

  4. JS获取网页中HTML元素的几种方法分析

    getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getEle ...

  5. PHP 一致性哈希算法的一种简单实现

    在分布式系统中,如果某业务可以由多个相同的节点处理,很容易想到用HASH的方式将业务请求分散到这些节点处理,比如memecache缓存等分 布式集群应用,如果只是简单的使用,不涉及用户用户状态等信息, ...

  6. canvas游戏和动画中的碰撞检测(2种简单方式)

    碰撞检测关键步骤 碰撞检测需要处理经历下面两个关键的步骤: 计算判断两个物体是否发生碰撞 发生碰撞后,两个物体的状态和动画效果的处理 计算碰撞 只要两个物体相互接触,它们就会发生碰撞. 矩形物体碰撞检 ...

  7. iOS 开发中常用的排序(冒泡、选择、快速、插入、希尔、归并、基数)算法

    1.冒泡排序: 冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素.如果一个元素比另一个元素大(小),那么就交换这两个元素的位置.重复这一比较直至最后一个元素.这一比较会重复n-1 ...

  8. C语言——<算法>_冒泡算法的使用及理解

    对数组内数值进行有规则排序时,就要用冒泡算法,也是比较简单的一个算法 #include <stdio.h> #include <stdlib.h> int main() { i ...

  9. (转)用JS实现表格中隔行显示不同颜色

    用JS实现表格中隔行显示不同颜色 第一种: <style> tr{bgColor:expression(     this.bgColor=((this.rowIndex)%2==0 )? ...

随机推荐

  1. docker镜像和加速

    首先,需要明确一个问题:Mirror 与 Private Registry 有什么区别? Private Registry 是开发者或者企业自建的镜像存储库,通常用来保存企业内部的 Docker 镜像 ...

  2. ping: sendto: No route to host

    root@tuhooo:/home/ # ping www.baidu.comPING www.a.shifen.com (61.135.169.125): 56 data bytesping: se ...

  3. C#高级应用

    学习编程也有大半年了,想起老师前天说的:“你们写的代码都是小儿科”,顿时有点心塞...想想也是,不可能就写一个For循环或者Foreach循环就可以拿到高薪了?我也觉得不太可能,下面我就来为大家简单介 ...

  4. JS中数组的拷贝方法

    之前在写一个vue的计算属性时,大概是这样: computed: { updateList () { let newList = this.List /*do something*/ return n ...

  5. robot framework断言

    一.基础 RobotFramework带有丰富的系统关键,使用时无需导入,直接使用,为写自动化用例带来了极大的方便:不能停留在知道或者是会得程度,只有熟练使用各关键字,才能提升自动化用例的写作效率.下 ...

  6. robotframework之使用cookies登陆

    有的系统是使用cookies保持登陆的,而RF的Request库里面没有像Selenium2Library里面一样操作cookies的关键字,若接口需要登录则只能用UI自动化先登录,然后再将cooki ...

  7. postgresql 10.5 主从复制--搭建测试

    env: role master slave host pg1 pg2 ip 11 12 pg-version 10.5 10.5 1 初始化查看 [ceiec@localhost ~]$ df -h ...

  8. 爬虫二之Requests

    requests 实例引入 import requests response = requests.get('https://www.baidu.com') response.status_code ...

  9. 应用安全 - CMS - Discuz漏洞汇总

    SSV-90861 Date:2012 类型:敏感信息泄露 影响范围:DZ x2.5  POC:http://www.xx.xx/uc_server/control/admin/db.php http ...

  10. django 的多对多关系

    django里自带的多对多表创建 其实就是两个多对一关系各自关联,在第三张表上 多对多的增加 add()可以传数值 例如 add(1)或数组 add(*[2,3]) 多对多反向操作 自己创建第三张表, ...