JavaScript tips —— 谈谈数组乱序
前言
先看一个段代码
function randArr (arr) {
return arr.sort(() => {
return (Math.random() - 0.5);
});
}
目的是为了实现给定数组的乱序。
利用数组的sort方法,判断随机出来的0~1的值与0.5的大小,实现伪排序。
为什么说是伪排序呢?代码的逻辑没毛病啊。
对,从这个层面来看,简单明了,完美的实现了需求,本着凡事往祖坟刨得精神。来看看这段代码的内部实现。
浏览器实现
ECMA Script
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare equal do not necessarily remain in their original order). If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y.
大致说的意思是,我不管你排序的算法稳不稳定,反正你能给用户自定义排序规则就行,不给你就爱咋折腾咋折腾~
这帮浏览器一听,好啊,老大发话了,那就八仙过海各显神通,各自都认为自己的实现是最牛逼的。
Chrome的sort
基于V8引擎,它的排序算进行了很多的优化,但是核心是小于等于10的数组用插入排序(稳定),大于10的采用了quickSort(不稳定),源码。
FireFox的sort
基于SpiderMonkey引擎,采用了归并排序(稳定), 源码
Safari的sort
基于Nitro(JavaScriptCore )引擎,如果没有自定义的排序规则传入,采用桶排序(不一定稳定, 桶排序的稳定性取决于桶内排序的稳定性, 因此其稳定性不确定。),传入自定义规则,采用归并排序(稳定),源码
Microsoft Edge/IE9+
基于Chakra引擎,采用快排(不稳定)源码
好了,那个说sort可以不是伪排序的同学,你看见我这40米的大刀没?
什么,你还嘴硬,我喜欢你的性格,看下面:
github上的大神对 var letters = ['A','B','C','D','E',‘F’,‘G’,'H','I','J'];
进行了10000次乱序处理,发现结论: 元素大概率停留在自己的初始位置。
具体地址: HOUCe/shuffle-array

看见没,矮要承认,挨打要立正。

洗牌算法(Fisher-Yates)
想要实现真正意义上的乱序,我们来研究一下:只要满足每个元素出现在各个位置的概率同等即可。
少年,听过如来神掌吗?
有个Fisher-Yates的洗牌算法,满足您的各种乱序需求,物美价廉,杀人越货居家旅行的必备精品~(其实有三个版本,有兴趣的自行搜索)
算法的大致描述
1.找到数组的屁股(最后一个元素);
2.在脑袋和屁股中间随机一个位置;
3.交换元素;
4.这时屁股是已经乱序后的元素,所以屁股前移;
5.如果屁股没打到脑袋上就继续1~4的步骤
function shuffle(arr) {
let length = arr.length,
r = length - 1,
rand = 0;
while (r) {
rand = Math.floor(Math.random() * r--);
[arr[r], arr[rand]] = [arr[rand], arr[r]];
}
return arr;
}
参考文献
https://github.com/HOUCe/shuffle-array
https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
http://efe.baidu.com/blog/talk-about-sort-in-front-end/
https://segmentfault.com/a/1190000010648740
JavaScript tips —— 谈谈数组乱序的更多相关文章
- JavaScript中实现最高效的数组乱序方法
数组乱序的意思是,把数组内的所有元素排列顺序打乱. 常用的办法是给数组原生的sort方法传入一个函数,此函数随机返回1或-1,达到随机排列数组元素的目的. 复制代码代码如下: arr.sort(fun ...
- js数组乱序输出 数组乱序排列
网上看的数组乱序输出,要么不合实际,要么代码繁琐.自己试了下,希望能给大家带来帮助. 重要思想也是Math.random*arr.length随机下标,然后删除取到的元素,继续随机下标. //将数组乱 ...
- [转载]排序:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap
长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序. google笔试小题.题目来源:http://wenku.baidu.com/view/5aa818dda5 ...
- js之数组乱序
这是最近面试遇到的,不过忘记了,之前也有印象刷到过这道题,就再次记录一下加深印象吧,听到最多的答案是利用sort方法,不过也有说这种方法不好,利用了快排和插入排序,那就整理下吧 <!DOCTYP ...
- 高频重要前端API手写整理(call,apply,bind,instanceof,flat,filter,new,防抖,节流,深浅拷贝,数组乱序,数组去重,继承, lazyman,jsonp的实现,函数的柯里化 )
Function.prototype.call = function(context,...args){ var context = context || window; context.fn = t ...
- javascript专题系列--js乱序
乱序的意思想必没有不知道:就是将数组打乱. 听到乱序一般都会想到js的随机函数Math.random(); var values = [1, 2, 3, 4, 5]; values.sort(func ...
- c#几种随机数组和数组乱序
相关资料MSDN:RNGCryptoServiceProvider Random Guid private static RNGCryptoServiceProvider rngCsp = n ...
- javascript洗牌算法 乱序算法 面试题
1.2种方案代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=" ...
- java将一数组乱序排列
JAVA的Collections类中shuffle方法模拟了“洗牌”动作可以对list列表进行随机排序.如果一定要自己写,算法也很简单:假设数组array长度为n.用标准随机函数rand(n)生成[0 ...
随机推荐
- 【转】Startssl SSL 证书申请图解
一.什么是 SSL 证书,什么是 HTTPS 网站? SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secu ...
- MongoDB-1:安装和配置
一.简介 MongoDB一种非关系型数据库(NoSql),是一种强大.灵活.可扩展的数据存储方式,因为MongoDB是文档模型,自由灵活很高,可以让你在开发过程中畅顺无比,对于大数据量.高并发.弱事务 ...
- 【我的Android进阶之旅】解决Android Studio启动时报错:Java 1.8 or later is required.
错误描述 在公司电脑上运行Android Studio 2.2已经有一段时间了,但是自己的笔记本上还是用的Android Studio 1.5,今天晚上下了一个Android Studio 2.2压缩 ...
- Open Source VOIP applications, both clients and servers (开源sip server & sip client 和开发库)
SIP Proxies SBO SIP Proxy Bypass All types of Internet Firewall JAIN-SIP Proxy Mini-SIP-Proxy A very ...
- python学习之路-第三天-函数
函数 函数的定义关键字:def 使用global语句可以清楚地表明变量是在外面的块定义的 示例:(函数运行完毕后x的值是2) #!/usr/bin/python # Filename: func_gl ...
- 使用npm构建前端项目基本流程
现在各种前端框架, 库文件基本都托管到npm上, 我们平常下载到别人的项目文件, 也基本是用npm 构建的, 不了解点node和npm那是寸步难行. 下面介绍的代码示例不敢说是最佳实践, 但都是我亲自 ...
- python16_day15【Django入门】
一.Django基本 1.什么是框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表 ...
- Java集合(3):Vector && Stack
一.Vector介绍 Vector可以实现可增长的动态对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删 ...
- vue-cli的utils.js文件详解
转载自:http://www.cnblogs.com/ye-hcj/p/7078047.html utils.js文件 // 引入nodejs路径模块var path = require('path' ...
- 笔记-mysql 导出查询结果
语法: The SELECT ... INTO OUTFILE 'file_name' [options] form of SELECT writes the selected rows to a f ...