JavaScript中的二分法插入算法
算法主体部分
var OnlineUser = {
//list : 待查找的数组
//key : 待插入的值
//order : 数组的顺序 1:从小到大 0:从大到小
//start : 开始查找的起始下标位置
//end : 开始查找的结束下标位置
//例:
//var arr1 = [17,15,15,14,14,13,13,8,8,7,7,6,5,4,3];
//var key = 8;
//var index = OnlineUser.GetPosIndex(arr1, key,0, arr1.length, 0);
GetPosIndex:function(list,key,order,start,end)
{
var index = -1;
var halfIndex = Math.abs(parseInt((end+start)/2));
if(list[halfIndex] == key) //在中位
{
index = halfIndex;
}
else if(list[halfIndex] < key && key < list[start])//在左半
{
index = OnlineUser.GetPosIndex(list, key, order, start, halfIndex);
}
else if(list[end] < key && key < list[halfIndex])//在右半
{
halfIndex ++ ;
index = OnlineUser.GetPosIndex(list, key, order, halfIndex, end);
}
else if(list[start] <= key && list[halfIndex] < key) //在左边
{
index = start;
}
else if(list[end] >= key && list[halfIndex] > key) //在右边
{
index = end + 1;
}
else //一个值都没有
{
index = 0;
}
return index;
},
Sort:function(array){
return array.sort(function(a, b){
return b - a;
});
},
GetInsIndex:function(list,key)
{
var index = 0;
//list = this.Sort(list);
for(var k=0;k<list.length;k++)
{
if(list[k] <= key)
{
index = k;
break;
}
else if(list[k] > key)
index = k+1;
else if(list[k] < key)
break;
}
return index;
}
}
完整的程序和测试页面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head>
<body>
<div id ="result"></div>
</body>
<script lang="javascript">
var OnlineUser = {
//list : 待查找的数组
//key : 待插入的值
//order : 数组的顺序 1:从小到大 0:从大到小
//start : 开始查找的起始下标位置
//end : 开始查找的结束下标位置
//例:
//var arr1 = [17,15,15,14,14,13,13,8,8,7,7,6,5,4,3];
//var key = 8;
//var index = OnlineUser.GetPosIndex(arr1, key,0, arr1.length, 0);
GetPosIndex:function(list,key,order,start,end)
{
var index = -1;
var halfIndex = Math.abs(parseInt((end+start)/2)); if(list[halfIndex] == key) //在中位
{
index = halfIndex;
}
else if(list[halfIndex] < key && key < list[start])//在左半
{
index = OnlineUser.GetPosIndex(list, key, order, start, halfIndex);
}
else if(list[end] < key && key < list[halfIndex])//在右半
{
halfIndex ++ ;
index = OnlineUser.GetPosIndex(list, key, order, halfIndex, end);
}
else if(list[start] <= key && list[halfIndex] < key) //在左边
{
index = start;
}
else if(list[end] >= key && list[halfIndex] > key) //在右边
{
index = end + 1;
}
else //一个值都没有
{
index = 0;
}
return index;
},
Sort:function(array){
return array.sort(function(a, b){
return b - a;
});
},
GetInsIndex:function(list,key)
{
var index = 0;
//list = this.Sort(list);
for(var k=0;k<list.length;k++)
{
if(list[k] <= key)
{
index = k;
break;
}
else if(list[k] > key)
index = k+1;
else if(list[k] < key)
break;
}
return index;
}
} var result = document.getElementById("result");
//测试用例,子数组第一个为从小到大顺序,第二个从大到小的顺序
var testArray = [
[[],[]],
[[1],[1]],
[[1,2,3,4,5],[17,15,14,13]],
[[11,12,13,14,15],[7,6,5,4,3,2,1]],
[[1,2,3,4,5,7,7,7,8,8,9,9,10],[17,15,15,14,14,13,13,8,8,7,7,6,5,4,3]],
[[1000003,1000003,1000003,1000003,1000003,11000269],[11000269,1000003,1000003,1000003,1000003,1000003]]
]; //期望值
var expectArray = [
[[0],[0]],
[[1],[0]],
[[5],[4]],
[[0],[0]],
[[10],[7]],
[[5],[1]]
]; //各用例要查找的值
var testKey = [
[8],
[8],
[8],
[8],
[8],
[1000003]
]; var start =0;//开始查找的起始下标位置
var end =0; //开始查找的结束下标位置
var index = 0; //待插入的位置 for(var i=0;i<testArray.length;i++) //组数
{
result.innerHTML += "<hr />";
for(var j=0;j<testArray[i].length;j++) //组单元
{
if(j==1) //大到小
{
start = 0;
end = testArray[i][j].length - 1;
index = OnlineUser.GetPosIndex(testArray[i][j], testKey[i][0],1, start, end);
result.innerHTML += "<br />small -> big: ["+testArray[i][j].toString()+"], key:"+testKey[i]+", index:" + index +", expect:"+expectArray[i][j]+ ((index == expectArray[i][j])?"":",<font color='red'>NotEq</font>");
}
else //从小到大
{
continue;
start = testArray[i][j].length - 1;
end = 0;
index = OnlineUser.GetPosIndex(testArray[i][j], testKey[i][0],0, start, end);
result.innerHTML += "<br />big <- small: ["+testArray[i][j].toString()+"], key:"+testKey[i]+", index:" + index+", expect:"+expectArray[i][j]+ ((index == expectArray[i][j])?"":",<font color='red'>NotEq</font>");
}
}
}
/* */ //构造测试数据
var bufferArray = [];
var newArray = [10002107,10002107,10000003,10002057,10000037,10000037,10000007,10000007,10000007,10000007,10000007,10000007,10000007,10000007,10002067,10000005,10000005,10000005,10000007,10000007,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005];
newArray.reverse();
for(var n = 0;n<10000;n++)
{
newArray[n] = parseInt(10000000 + Math.random() * 1000000);
}
var key = parseInt(10000000 + Math.random() * 1000000); //IE弹出"是否停止运行此脚本"脚本超时时间设置
//1. 打开注册表HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\Styles,如果 Styles 键不存在,创建调用 Styles 的一个新的项
//2. 创建新的 DWORD 值在此项下称为"MaxScriptStatements"并将值设置为所需的脚本语句数,如100000000 // ***************** 以下数据准确性测试 *********************
//系统法排序
var bArray = OnlineUser.Sort(newArray); //二分法插入
for(var m=0; m < newArray.length;m++)
{
var index = OnlineUser.GetPosIndex(bufferArray, newArray[m], 1,0, bufferArray.length-1);
//var index = OnlineUser.GetPosIndex(bufferArray, newArray[m], 0, bufferArray.length,0);
bufferArray.splice(index, 0, newArray[m]);
} //结果打印
var a = bufferArray.toString();
var b = bArray .toString();
result.innerHTML += "<br />Rnd:" + newArray.toString();
result.innerHTML += "<br />Dic:" + a;
result.innerHTML += "<br />Sys:" + b;
result.innerHTML += "<br /> Eq:" + (a == b); // ***************** 以下性能测试 *********************
//将数据分为5段,做采样
var keyArr = [];
for(var ki=0;ki<5;ki++)
{
keyArr.push(newArray.length * ki * 0.2);
} var cnt = 1000;
var idx =0 ;
var dateStart,dateEnd,timeSpan; //遍历方法插入
result.innerHTML += "<br />"+keyArr.toString();
result.innerHTML += "<br />GetInsIndex: ckey key idx cnt t(ms)";
for(var ckey=0;ckey<keyArr.length;ckey++)
{
dateStart = new Date(); //@@@TEST
for(var x=0;x<cnt;x++ )
{
idx = OnlineUser.GetInsIndex(bArray, bArray[keyArr[ckey]]+1);
}
dateEnd = new Date();t = dateEnd.getTime() - dateStart.getTime();
result.innerHTML +="<br />"+ckey+" "+keyArr[ckey] + " "+idx+" "+cnt+" "+t;
} cnt = 10000;
//二分法插入
result.innerHTML += "<br />GetPosIndex: ckey key idx cnt t(ms)";
for(var ckey=0;ckey<keyArr.length;ckey++)
{
dateStart = new Date(); //@@@TEST
for(var x=0;x<cnt;x++ )
{
idx = OnlineUser.GetPosIndex(bArray, bArray[keyArr[ckey]]+1,1,0,bArray.length -1 );
}
dateEnd = new Date();t = dateEnd.getTime() - dateStart.getTime();
result.innerHTML +="<br />"+ckey+" "+keyArr[ckey] + " "+idx+" "+cnt+" "+t;
}
</script>
</html>
JavaScript中的二分法插入算法的更多相关文章
- javascript中数组的常用算法深入分析
Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascri ...
- JavaScript中的分号插入机制
原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 functi ...
- JavaScript中的不同逻辑算法结合操作解决实际多重问题以及常用函数类型
数组去重+快速排序 //老数组var arr1 = [1,2,2,3,8,6,6,4,5,5];//定义新数组var arr2 = [ ];内部可运用布尔型进行判断数组的唯一性 for(i=0;i&l ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法
前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...
- javascript中的队列结构
1.概念 队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构.队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在 ...
- JavaScript中的内存泄漏以及如何处理
随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...
随机推荐
- mongodb的安装使用和pymongo基本使用
(1) mongodb的安装 下载tgz解压后,需要添加相应的环境变量才能在终端直接启动mongod. mongodb数据存储在/data/db中,需要手动创建目录树,同时mongod执行的时候如果权 ...
- svn如何给新文件加锁
第一步: 右键subversion(版本控制) 第二部:找到 subversion properties 第二部: add进行添加
- MPU6050工作原理及STM32控制MPU6050
源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍
- 什么是MSB/LSB码?
MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧. L ...
- Your app uses or references the following non-public APIs的解决方案
之前接了一个旧的项目,代码混乱,年代久远,不得不吐槽一波,好不容易改完需求提交代码,说用到了non-public APIs,搞了好久终于找到地方了,下面是我的解决过程,让大家少走弯路: 下面的被驳回的 ...
- GCD汇总
//总结如下: //1.同步请求:不会开启新的线程 //1-1.同步请求--串行队列:不开启新线程--按照顺序执行下去 //1-2.同步请求--并发列队:不开启新线程--按照顺序执行下去 //2.异步 ...
- VS 安装部署项目自解压程序解压后按顺序执行多个程序
这篇blog介绍了如何用VS创建安装部署方案,以及如何制作自解压程序.然后我的程序中需要解压后按照顺序先后安装2个exe.winrar的解压后执行,虽然可以用分号填写多个应用,但貌似是同时执行的.为了 ...
- eclipse——jsp字体设置
步骤如下
- NUnit单元测试笔记
vs2010 和 NUnit 问题处理. . 在 <configuration> 下 加 ... <startup> <requiredRuntime version=& ...
- Rancher + K8S RestApi使用
1前言 1.1使用的软件及版本 软件 版本号 Rancher 1.6stable Kubernetes 1.8.3 Docker 1.12.6 1.2 Rancher与K8S的RESTAPI差异 ...