'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随机数生成与排序的更多相关文章

  1. JS中对象排序

    详细代码如下: var s=[{name:"abc",value:10},{name:"dbc",value:5},{name:"acc", ...

  2. js函数文件排序化

    因为本人的某些小强迫症,写了一个格式化并根据js函数名排序的c++程序,此作mark #include <stdio.h> #include <map> #include &l ...

  3. 案例学习总结:原生JS实现表格排序

    最近在学习js的表格排序,没想到看不起眼的表格排序实际上却暗含了众多JS知识点.在这里记录一下此次学习过程.希望对大家也有所帮助. 完整的表格排序涉及了下列这些知识点: call方法使用 sort方法 ...

  4. JS对表格排序(支持对序号,数字,字母,日期)

    JS对表格排序(支持对序号,数字,字母,日期) 前不久看到淘宝组件有"对表格排序的插件" 如想要看 可以看这个地址 http://gallery.kissyui.com/KSort ...

  5. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  6. js数组对象排序详解

    一.js对象遍历输出的时候真的是按照顺序输出吗? 下边就来实践一下: var obj={'3':'ccc',name:'abc',age:23,school:'sdfds',class:'dfd',h ...

  7. js 十大排序算法 All In One

    js 十大排序算法 All In One 快速排序 归并排序 选择排序 插入排序 冒泡排序 希尔排序 桶排序 堆排序(二叉树排序) 基数排序 计数排序 堆排序(二叉树排序) https://www.c ...

  8. js 日期时间排序 数组

    不多说直接show代码 var timeArr=[ {'id':'A01','date':'2016-04-20 23:22:11'}, {'id':'A02','date':'2016-04-21 ...

  9. JS写的排序算法演示

    看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...

随机推荐

  1. 关闭Tomcat进程 一条语句(必看)

    写在开始 MAC系统下进行JAVA研发,经常遇到的一个问题就是杀死异常Tomcat 通常都是用两条指令,先查询出Tomcat占用的进程,再kill掉该进程, 其实有一种联合语句的方式可以一条语句直接关 ...

  2. 编译安装hadoop2.6.3

    一.安装环境 1.1  JAVA  安装java1.7 下载jdk1.7: [root@node1~]# wget http://download.oracle.com/otn-pub/java/jd ...

  3. c++反射概念-简单介绍

    C++ 反射机制的简单实现 C++并不支持反射机制,只能自己实现. 如果需要实现字字符串到函数到映射,一定要使用到函数指针. 简单实现反射机制,根据字符串来构造相应到类.主要有以下几点: (1) 可以 ...

  4. C# .net 调用QQ邮箱

    public static void QQfs() { try { MailMessage mm = new MailMessage(); MailAddress Fromma = new MailA ...

  5. iframe 随内容自适应高度

    兼容性好的 html代码: <iframe src="enterprise/enter_edit.aspx" id="mainframe" framebo ...

  6. tomcat8配置管理员后仍然报403

    tomcat8配置管理员后仍然报403   修改conf/tomcat-users.xml <role rolename="manager"/> <role ro ...

  7. EasyUI 学习笔记

    EasyUI常见错误 1 . 无论是用HMTL形式实现组件还是使用代码 + HTML 形式实现组件 , 在为组件设置属性时 , 要注意属性值的类型问题 string:必须加引号 number:不加任何 ...

  8. WPF比较两个随机数大小写,利用MVVM思想实现

    MVVM模式是把表现层和业务层完全分离,所以这里就使用MVVM制作一个极其简单的WPF的例子: 先看看最终图:

  9. java map的键是唯一的 所有 用set类型存放

  10. iOS-UI控件概述

    IBAction和IBOutlet,UIView 1 @interface ViewController : UIViewController 2 3 @property(nonatomic, wea ...