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高级编程-itertoos模块
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先我们看看itertools模块提供的几个“无限”迭代器, import itertools naturals = ...
- apache访问403错误
1.排查selinux 2.目录权限 3.WEB主目录是否正确
- Swift-可选值(Optional)讲解
前提:Swift中有规定:对象中的任何属性在创建时,都必须要有明确的初始化值 1.定义可选类型 方式一:常规方式(不常用) var name : Optional<String> = ni ...
- 【MVC4升级到MVC5】ASP.Net MVC 4项目升级MVC 5的方法
1.备份你的项目 2.从Web API升级到Web API 2,修改global.asax,将 ? 1 WebApiConfig.Register(GlobalConfiguration.Config ...
- linux线程同步实例
[Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details ...
- Ninject学习资料
https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel http://www.cnblogs.com/willick/p/3223 ...
- VisualVM使用方法
VisualVM 简介 VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序( ...
- 【数据库】】MySQL之desc查看表结构的详细信息
在mysql中如果想要查看表的定义的话:有如下方式可供选择 1.show create table 语句: show create table table_name; 2.desc table_nam ...
- java从远程服务器获取PDF文件并后台打印(使用pdfFox)
一.java原生方式打印PDF文件 正反面都打印,还未研究出只打印单面的方法,待解决 public static void printFile(String path) throws Exceptio ...
- codeforces 730 j.bottles
J. Bottles time limit per test 2 seconds memory limit per test 512 megabytes input standard input ou ...