算法主体部分

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中的二分法插入算法的更多相关文章

  1. javascript中数组的常用算法深入分析

    Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascri ...

  2. JavaScript中的分号插入机制

    原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 functi ...

  3. JavaScript中的不同逻辑算法结合操作解决实际多重问题以及常用函数类型

    数组去重+快速排序 //老数组var arr1 = [1,2,2,3,8,6,6,4,5,5];//定义新数组var arr2 = [ ];内部可运用布尔型进行判断数组的唯一性 for(i=0;i&l ...

  4. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  5. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  6. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  7. Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

    前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...

  8. javascript中的队列结构

    1.概念 队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构.队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在 ...

  9. JavaScript中的内存泄漏以及如何处理

    随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...

随机推荐

  1. 微信小程序组件progress

    基础内容progress:官方文档 Demo Code: Page({ data:{ percent:0 }, onReady:function(){ this.percentAdd(); }, pe ...

  2. C# winform 屏蔽鼠标右键 spreadsheet Gear 屏蔽鼠标右键菜单

    今天用到spreadsheetGear 插件,然后右键有插件自己的菜单.都是英文的,而且还能打开新的窗体.嵌到程序里面,不太合适,所以着手屏蔽. 刚开始用的Mouse_up,虽然能捕获事件,但是没有K ...

  3. 【JavaScript】动态的小球

    参考: 1.CSS 对比 JavaScript 动画 2.CSS制作水平垂直居中对齐_水平居中, 垂直居中 教程_w3cplus:https://www.w3cplus.com/css/vertica ...

  4. c刷新缓冲区

    int c; while((c = getchar()) != '\n' && c != EOF);

  5. BeatSaber节奏光剑插件开发官方教程2-简单的插件示例

    原文:https://wiki.assistant.moe/modding/example-mod 一.在开始之前 1 确保你已经看过教你如何添加插件模板的教程,且你已经使用插件模板创建了一个新项目 ...

  6. Eclipse使用Maven搭建Java Web项目并直接部署Tomcat

    1.环境: Windows 10 Java 1.8 Maven 3.3.9 Eclipse IDE for Java EE Developers 2.准备: eclipse环境什么的不赘述,Maven ...

  7. ResulsetHandler九个实现类

    ResulsetHandler九个实现类 ArrayHandler, 将结果集中第一条记录封装到Object[],数组中的每一个元素就是记录中的字段值. ArrayListHandler, 将结果集中 ...

  8. System.load 和 System.loadLibrary详解

    System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI ...

  9. JAVA文件下载,页面显示另存为效果

    经过测试  firefox.QQ.IE 浏览器是可以的  chrome浏览器不行(直接下载了) 1. 系统框架springmvc+jsp 2. 后台servlet代码 @RequestMapping( ...

  10. Python基础笔记系列五:元组

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 元组 1)元组的结构和访问.使用方法和列表基本一致,区别主要有两点:1.使 ...