'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. Python3 小工具-ARP扫描

    from scapy.all import * import optparse import threading import os def scan(ipt): pkt=Ether(dst='ff: ...

  2. ThinkPHP - 4 - 学习笔记(2015.4.12)

    ThinkPHP D方法 D方法用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:D('[项目://][分组/]模型' ...

  3. BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...

  4. POJ 1921 Paper Cut(计算几何の折纸问题)

    Description Still remember those games we played in our childhood? Folding and cutting paper must be ...

  5. POJ 1228 Grandpa's Estate(凸包唯一性判断)

    Description Being the only living descendant of his grandfather, Kamran the Believer inherited all o ...

  6. css重修之书(一):如何用css制作比1px更细的边框

    如何用css制作比1px更细的边框 在项目的开发过程中,我们常常会使用到border:1px solid xxx,来对元素添加边框: 可是1px的border看起来还是粗了一些粗,不美观,那么有什么方 ...

  7. Swift-重写(Override)

    子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或附属脚本(subscript)提供自己定制的实现(i ...

  8. 【log4net】- 非常完善的Log4net详细说明

    1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...

  9. dwarf是怎样处理的栈帧?

    dwarf是如何处理的栈帧呢? 首先看下非dwarf的情况是如何处理栈帧的: 1 3623804982590 0x3e90 [0xb0]: PERF_RECORD_SAMPLE(IP, 0x1): 1 ...

  10. 2018 杭电多校1 - Chiaki Sequence Revisited

    题目链接 Problem Description Chiaki is interested in an infinite sequence $$$a_1,a_2,a_3,...,$$$ which i ...