js随机数生成与排序
'use strict';
// 排序算法、 // 生成一个指定数量的不含重复数字的随机数组
function ranArr(n,callback) {
var res = [];
var tmp ;
res = lack(res,n);
ckRanArr(res,n,,function (res) {
return callback(res);
});
} // 生成一个指定范围内(正整数 a到b)的随机数
function ranNum(a,b){
var n = Math.abs(a - b );
var base_n = a;
if(a > b){ base_n = b; }
var res = Math.floor(Math.random()*n) + base_n;
return res;
} // 返回去除重复项后的数组
function quchong(arr) {
var arr2 = arr.slice();
var arr2_len = arr2.length;
var arr3 = []; for(var j = ;j < arr2_len;j++){
// 重复项不进新数组 去重
(function (item,ind) {
var flag = false;
for(var k = (ind + );k < arr2_len; k++){
if(item == arr2[k]){
flag = true;
}
}
if(!flag){
arr3.push(item);
}
}) (arr2[j],j);
}
return arr3;
} // 补缺失的量并检查
function lack(arr,n) {
// 去重后数量少了 补上
var arr_len = arr.length;
if(arr_len < n){
var lack = n - arr_len;
for(var j = ; j < lack;j++){
arr.push( ranNum(,) );
}
}
return arr;
} // 递归检查函数 count:重试次数 重试次数限制与生成数量相关
function ckRanArr(arr,n,count,callback){ var limit;
if(n < ){
limit = *n;
}
if(n >= ){
limit = n;
}
if(count < limit){
count++;
var arr2 = quchong(arr); // 去重
if(arr2.length < n ){
var arr3 = lack(arr2,n); // 补量
ckRanArr(arr3,n,count,callback);
}
else{
return callback(arr2);
}
}
else{
return callback( quchong(arr) );
}
} ranArr(,function (res) {
console.log(res);
});
// 上面的递归调用会发生每个函数都是一个栈,会生成一个不断堆叠的函数栈直到最后一个栈函数return后依次退出。
// 同步循环生成版
function ranArr2(n){
var arr = [];
arr = lack(arr,n);
var limit;
if(n < ){
limit = *n;
}
else{
limit = n;
}
cl:for(var i = ;i < limit;i++){ console.log(i);
var arr2 = quchong(arr); // 去重
if(arr2.length < n){
arr = lack(arr2,n); // 补量
}
else{
break cl;
}
}
return arr;
}
优化性能效率版
// 前两个版本生成指定数量不重复的随机数效率太低了,
// 举例生成1000个 每一次去重时都需要接近1000 x 1000次的比较
// 优化之后速度有了极大的提升
// 生成范围 0-30000 生成20000个不重复随机数
// ranArr2 平均需要23s(秒)左右
// ranArr3 平均需要300ms左右
//在数据范围和数据量接近 重复几率大的时候1位1位排重的方式具有很高的性能
//在数据范围和数据量差距很大 10万条 1亿 ran3平均需要5s左右 ran2需要23s左右
// 数据范围增加100倍 10万条 ran2 21s左右 function ranArr3(n) { var arr = [];
var arr2 = [];
if(n <= ){
return arr2;
}
arr = lack(arr,n);
arr2.push(arr[]);
// console.log('第0个数:'+arr2);
var arr_len = arr.length;
for (var i = ; i < arr_len; i++) {
// console.log('第'+i+'个数:'+arr[i]);
arr2 = not_in_arr_item(arr[i],i,arr2 );
// console.log('得到arr2为:['+arr2+']');
}
return arr2;
} // 给定一个数组 和元素,返回一个不在数组中已有元素的元素
function not_in_arr_item(item,ind,arr2) {
//console.log( '每次进入: '+ 'item:' + item + ' ind:' + ind + ' [' + arr2 + ']'); var flag = false;
cl:for (var j = ; j < ind; j++) {
// console.log('j:'+j);
if(item == arr2[j]){
flag = true;
break cl;
}
}
// console.log(flag);
if(flag){
item = ranNum(,);
//console.log('进入ran: '+item);
return not_in_arr_item(item,ind,arr2);
}
if(!flag){
arr2.push(item);
return arr2;
}
}
排序算法部分
// 取5次的平均时间
// 比较 (个数) 冒泡 快速排序 插入排序
// 100 0.354ms 0.443ms 0.294ms
// 1000 2.94ms 2.351ms 1.89ms 1.84ms
// 10000 158.39ms 12.15ms 56.8ms 55.3ms
// 50000 5026ms 54ms 1286ms 1298ms // 冒泡排序
function maopao(arr) {
var arr1 = arr.slice();
var len = arr1.length;
for(var i = ;i < len;i++){
for(var j = (i+);j<len;j++){
if(arr1[i] > arr1[j]){
var tmp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = tmp;
}
}
}
return arr1;
} // console.time('maopao');
// var maopao_arr = maopao(arr1);
// console.timeEnd('maopao');
// console.log(maopao_arr); // 快排 快速排序
//1、找基准(一般是以中间项为基准)
//2、遍历数组,小于基准的放在left,大于基准的放在right
//3、递归
function kuaipai(arr) {
if(arr.length<=){return arr;}
var index = Math.floor(arr.length/);
var base_num = arr.splice(base_num,)[]; var l = [];
var r = [];
var len = arr.length;
for(var i = ; i < len;i++){
if(arr[i]<= base_num){
l.push(arr[i]);
}
else{
r.push(arr[i]);
}
}
return kuaipai(l).concat( [base_num],kuaipai(r) );
} // console.time('kuaipai');
// var kuaipai_arr = kuaipai(arr1);
// console.timeEnd('kuaipai');
// console.log(kuaipai_arr); // 插入排序
// 类似于斗地主整理牌时窝们人类所使用的算法:不断把牌抽出来,插入到已有牌中应处的位置
// 将n个元素的数列分为已有序和无序两个部分
// 将该数列的第一元素视为有序数列,后面都视为无序数列
// 将无序数列中的元素插入到有序数列的对应位置,插入前通过比大小的方式找到其在有序数列中的对应位置。
// 找位置的时候有两种方式找,就近找可以减少比较次数
function insertSort(arr){
var len = arr.length;
for (var i = ; i < len; i++) {
//不断和前一个数比
if(arr[i] < arr[i-] ){
var el = arr[i]; var ind;
//找插入位置
look: for(var j = ;j<len;j++){
if( el < arr[j]){
ind = j;
break look;
}
} // 从j开始到原插入元素部分全部后移一位
for(var k = i;k>j;k--){
arr[k] = arr[k-]
}
arr[ind] = el;
}
}
return arr;
}
// console.log(arr1);
// console.time('insertSort');
// var insert_arr = insertSort(arr1);
// console.timeEnd('insertSort');
// console.log(insert_arr); function insertSort2(arr) {
var len = arr.length;
for (var i = ; i < len; i++) {
if(arr[i] < arr[i-] ){
var el = arr[i];
arr[i] = arr[i-]; var j = i-;
while( (j >= ) && (el < arr[j]) ){
arr[j+] = arr[j];
j--;
}
arr[j] = el;
}
}
return arr;
}
// console.log(arr1);
console.time('insertSort2');
var insert_arr2 = insertSort(arr1);
console.timeEnd('insertSort2');
// console.log(insert_arr2);
paixu.js
'use strict';
// 排序算法、 var arr1 = ranArr2();
// 取5次的平均时间
// 比较 (个数) 冒泡 快速排序 插入排序
// 100 0.354ms 0.443ms 0.294ms
// 1000 2.94ms 2.351ms 1.89ms 1.84ms
// 10000 158.39ms 12.15ms 56.8ms 55.3ms
// 50000 5026ms 54ms 1286ms 1298ms // 冒泡排序
function maopao(arr) {
var arr1 = arr.slice();
var len = arr1.length;
for(var i = ;i < len;i++){
for(var j = (i+);j<len;j++){
if(arr1[i] > arr1[j]){
var tmp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = tmp;
}
}
}
return arr1;
} // console.time('maopao');
// var maopao_arr = maopao(arr1);
// console.timeEnd('maopao');
// console.log(maopao_arr); // 快排 快速排序
//1、找基准(一般是以中间项为基准)
//2、遍历数组,小于基准的放在left,大于基准的放在right
//3、递归
function kuaipai(arr) {
if(arr.length<=){return arr;}
var index = Math.floor(arr.length/);
var base_num = arr.splice(base_num,)[]; var l = [];
var r = [];
var len = arr.length;
for(var i = ; i < len;i++){
if(arr[i]<= base_num){
l.push(arr[i]);
}
else{
r.push(arr[i]);
}
}
return kuaipai(l).concat( [base_num],kuaipai(r) );
} // console.time('kuaipai');
// var kuaipai_arr = kuaipai(arr1);
// console.timeEnd('kuaipai');
// console.log(kuaipai_arr); // 插入排序
// 类似于斗地主整理牌时窝们人类所使用的算法:不断把牌抽出来,插入到已有牌中应处的位置
// 将n个元素的数列分为已有序和无序两个部分
// 将该数列的第一元素视为有序数列,后面都视为无序数列
// 将无序数列中的元素插入到有序数列的对应位置,插入前通过比大小的方式找到其在有序数列中的对应位置。
// 找位置的时候有两种方式找,就近找可以减少比较次数
function insertSort(arr){
var len = arr.length;
for (var i = ; i < len; i++) {
//不断和前一个数比
if(arr[i] < arr[i-] ){
var el = arr[i]; var ind;
//找插入位置
look: for(var j = ;j<len;j++){
if( el < arr[j]){
ind = j;
break look;
}
} // 从j开始到原插入元素部分全部后移一位
for(var k = i;k>j;k--){
arr[k] = arr[k-]
}
arr[ind] = el;
}
}
return arr;
}
// console.log(arr1);
// console.time('insertSort');
// var insert_arr = insertSort(arr1);
// console.timeEnd('insertSort');
// console.log(insert_arr); function insertSort2(arr) {
var len = arr.length;
for (var i = ; i < len; i++) {
if(arr[i] < arr[i-] ){
var el = arr[i];
arr[i] = arr[i-]; var j = i-;
while( (j >= ) && (el < arr[j]) ){
arr[j+] = arr[j];
j--;
}
arr[j] = el;
}
}
return arr;
}
// console.log(arr1);
console.time('insertSort2');
var insert_arr2 = insertSort(arr1);
console.timeEnd('insertSort2');
// console.log(insert_arr2); // 生成一个指定数量的不含重复数字的随机数组
// 同步递归回调版
function ranArr(n,callback) {
var res = [];
res = lack(res,n);
ckRanArr(res,n,,function (res) {
return callback(res);
});
}
// 同步循环生成版
function ranArr2(n){
var arr = [];
arr = lack(arr,n);
var limit;
if(n < ){
limit = *n;
}
else{
limit = n;
}
cl:for(var i = ;i < limit;i++){ //console.log(i);
var arr2 = quchong(arr); // 去重
if(arr2.length < n){
arr = lack(arr2,n); // 补量
}
else{
break cl;
}
}
return arr;
} // 生成一个指定范围内(正整数 a到b)的随机数
function ranNum(a,b){
var n = Math.abs(a - b );
var base_n = a;
if(a > b){ base_n = b; }
var res = Math.floor(Math.random()*n) + base_n;
return res;
} // 返回去除重复项后的数组
function quchong(arr) {
var arr2 = arr.slice();
var arr2_len = arr2.length;
var arr3 = []; for(var j = ;j < arr2_len;j++){
// 重复项不进新数组 去重
(function (item,ind) {
var flag = false;
for(var k = (ind + );k < arr2_len; k++){
if(item == arr2[k]){
flag = true;
}
}
if(!flag){
arr3.push(item);
}
}) (arr2[j],j);
}
return arr3;
} // 补缺失的量并检查
function lack(arr,n) {
// 去重后数量少了 补上
var arr_len = arr.length;
if(arr_len < n){
var lack = n - arr_len;
for(var j = ; j < lack;j++){
arr.push( ranNum(,) );
}
}
return arr;
} // 递归检查函数 count:重试次数 重试次数限制与生成数量相关
function ckRanArr(arr,n,count,callback){ var limit;
if(n < ){
limit = *n;
}
if(n >= ){
limit = n;
}
if(count < limit){
count++;
var arr2 = quchong(arr); // 去重
if(arr2.length < n ){
var arr3 = lack(arr2,n); // 补量
ckRanArr(arr3,n,count,callback);
}
else{
return callback(arr2);
}
}
else{
return callback( quchong(arr) );
}
} // console.time('a');
// var tmp = ranArr2(1000);
// console.timeEnd('a');
// console.log( tmp ); // ranArr(10,function (res) {
// console.log(res);
// });
js随机数生成与排序的更多相关文章
- JS中对象排序
详细代码如下: var s=[{name:"abc",value:10},{name:"dbc",value:5},{name:"acc", ...
- js函数文件排序化
因为本人的某些小强迫症,写了一个格式化并根据js函数名排序的c++程序,此作mark #include <stdio.h> #include <map> #include &l ...
- 案例学习总结:原生JS实现表格排序
最近在学习js的表格排序,没想到看不起眼的表格排序实际上却暗含了众多JS知识点.在这里记录一下此次学习过程.希望对大家也有所帮助. 完整的表格排序涉及了下列这些知识点: call方法使用 sort方法 ...
- JS对表格排序(支持对序号,数字,字母,日期)
JS对表格排序(支持对序号,数字,字母,日期) 前不久看到淘宝组件有"对表格排序的插件" 如想要看 可以看这个地址 http://gallery.kissyui.com/KSort ...
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- js数组对象排序详解
一.js对象遍历输出的时候真的是按照顺序输出吗? 下边就来实践一下: var obj={'3':'ccc',name:'abc',age:23,school:'sdfds',class:'dfd',h ...
- js 十大排序算法 All In One
js 十大排序算法 All In One 快速排序 归并排序 选择排序 插入排序 冒泡排序 希尔排序 桶排序 堆排序(二叉树排序) 基数排序 计数排序 堆排序(二叉树排序) https://www.c ...
- js 日期时间排序 数组
不多说直接show代码 var timeArr=[ {'id':'A01','date':'2016-04-20 23:22:11'}, {'id':'A02','date':'2016-04-21 ...
- JS写的排序算法演示
看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...
随机推荐
- Python面向对象-类成员
类的成员可以分为三大类:字段.方法和属性: 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在 ...
- JavaScript筑基篇(二)->JavaScript数据类型
说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 numb ...
- Memory及其controller芯片整体测试方案(上篇)
如果你最近想买手机,没准儿你一看价格会被吓到手机什么时候偷偷涨价啦! 其实对于手机涨价,手机制造商也是有苦难言,其中一个显著的原因是存储器芯片价格的上涨↗↗↗ >>> 存储器memo ...
- 基于NABCD评论“探路者”Alpha版作品
1.分析 N(Need):”为了重温贪吃蛇这一经典游戏,本组的选题定为贪吃蛇游戏,并在此基础上进行了新的创新,将普通的贪吃蛇游戏改为单词版贪吃蛇.市面上的英语单词背记软件对于那些缺少英语学习兴趣.毅力 ...
- Thunder团队——文案+美工
团队名称:Thunder 组长:王航 成员:李传康.代秋彤.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 项目名称:爱阅app 需求概述: 现在市面上有很多手机阅读器,但是基本上不是收费就是广告满天飞.基于这种 ...
- TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接
一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...
- 【APS.NET Core】- Json配置文件的读取
在项目目录下有个 appsettings.json ,我们先来操作这个文件.在appsettings.json中添加以下内容: { "Logging": { "LogLe ...
- win7系统日志分支删除方法
这篇日志有问题,自己亲身尝试失败,这里只提供思路,谢谢(改天突破再做修改) 之前电脑装过德国的叫啥子软件来着,当时在系统自动创建了日志,后来软件卸载了,发现还是有这个日志主键,(我有强迫症)心里不爽, ...
- Oracle基础 表分区
Oracle基础 表分区 一.表分区 (一)表分区的分类 1.范围分区(range) 2.散列分区(hash) 3.列表分区(list) 4.复合分区:范围-哈希(range-hash).范围-列表( ...
- 【Python】Python SQLAlchemy基本操作和常用技巧
首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQL InnoDB 使用,所以使用其他数据库的也不能完全照搬本文. 接着就从安装 ...