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编码时,更好的应对内存泄漏带来的问题. 概 ...
随机推荐
- 一行代码实现笔记本跳过微信认证连接WIFI
一行代码实现笔记本跳过微信认证连接WIFI 本文作者原创,没有参考其他文章,方法很简单但是很实用,转载请注明出处,谢谢! 问题 有一些WIFI需要通过微信认证才能连接,手机当然是可以的,但是我们手头的 ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- CentOS7种搭建FTP服务器
1.安装vsftpd #首先要查看你是否安装vsftp [root@localhost /]# rpm -q vsftpd vsftpd-3.0.2-10.el7.x86_64 ...
- Saltstack 命令行:批量发送命令,返回执行结果
批量发送发送命令符,并返回结果. salt '*' cmd.run 'df -h' ---------------------------------------- Stest1: Filesyste ...
- html4与html5的区别
一.HTML5更加灵活,支持下列多种形式 1.标签名可以大写(不推荐) -<SpAN>这个HTML5也的认</SpAN> 2.属性双引号可选(推荐添加双引号) -<div ...
- apache php 60 503
服务器端:apache php 文件上传,60秒后,返回Response 503 php-fpm.conf: request_terminate_timeout = 600 前算万算没想到这里还有个超 ...
- 利用web workers实现多线程处理
利用web workers在后台线程中实现对数据库的增删改查操作,并在后台线程中生成页面上某个列表的完整的HTML代码,然后再前台脚本中直接将这段HTML代码输出到页面上! 利用web workers ...
- 在winform中,禁止combobox随着鼠标一起滑动!
在winform中,如果form上或者是控件上有一个combobox控件,当你选择这个控件,当你鼠标移动其他地方,滑动鼠标时,这时combobox的选择值就会随之鼠标一起变化,如果你不想让comboB ...
- PHP练习题一
目录:1.如何使用php导入导出csv?2.php接收POST数据的方式有哪些?3.如何让json_encode()不转义斜杠?我在做服务器返回一些数据时需要返回一些地址,但是默认的json_code ...
- 记一次如何解决低版本jar包里面的bug,不适宜替换成高版本的经历
背景:目前正在迭代开发的项目,应用户要求新增一个电子文档转换的功能,即将不标准的excel文件转换为标准的excel文件(标准模板). 选择:pio ,本项目里面本来就有poi的jar包 问题:项目里 ...