Code
<html>
<head>
<title>JS折半查找实例</title>
</head>
<body onload="$('selectValue').focus();">
查询值(0 - 100000):<input id="selectValue" type="text" />
<div style="width: 50%;border: #606066 1px solid; float: left">
<p><a href="javascript: halfSelect()">折半查询</a></p>
<p>用时(毫秒):<span id="times1"></span></p>
<p>查找值所在位置:<span id="valueIndex1"></span></p>
</div>
<div style="width: 50%;border: #606066 1px solid; float:left">
<p><a href="javascript: sortSelect()">顺序查询</a></p>
<p>用时(毫秒):<span id="times2"></span></p>
<p>查找值所在位置:<span id="valueIndex2"></span></p>
</div>
<script type="text/javascript">
function $(id)
{
return document.getElementById(id);
}
//实例数组
var all = new Array();
for (var i = 0; i <= 100000; i++)
{
all.push(i);
}
//顺序查询
Array.prototype.sortSelect = function(value)
{
var index =0;
for(var i = 0; i < this.length; i++)
{
if (value == this[i])
{
return i;
}
}
return -1;
}
//查询传入的value值所在数组中的位置(仅针对按照规则排序有效)
//返回值:查询值所在数组的index,-1不存在
//coding by pippe pippe@163.com
Array.prototype.select = function(value)
{
var min = 0;
var max = this.length - 1;
var minValue = this[min];
var maxValue = this[max];
//排列顺序,0顺序,1逆序
var sortType = 0;
if (maxValue < minValue)
{
//判断是否逆序
sortType = 1;
var temp = minValue;
minValue = maxValue;
maxValue = temp;
}
if (value == this[min])
{
return min;
}
if (value == this[max])
{
return max;
}
if (value < minValue || value > maxValue)
{
//不在范围内
return -1;
}
return sortType == 0 ? this.halfSelectByOrdinal(value, min, max) : this.halfSelectByReverse(value, min, max);
}
//顺序折半查询
Array.prototype.halfSelectByOrdinal = function(value, min, max)
{
if (min + 1 == max || min == max)
{
if (value == this[min])
{
return min;
}
if (value == this[max])
{
return max;
}
return -1;
}
var half = min + parseInt((max - min) / 2);
var index;
if (value == this[half])
{
//命中
return half;
}
if (value < this[half])
{
//在前半部分
return this.halfSelectByOrdinal(value, min, half);
}
if (value > this[half])
{
//在后半部分
return this.halfSelectByOrdinal(value, half, max);
}
return -1;
}
//逆序折半查询
Array.prototype.halfSelectByReverse = function(value, min, max)
{
if (min + 1 == max || min == max)
{
if (value == this[min])
{
return min;
}
if (value == this[max])
{
return max;
}
return -1;
}
var half = min + parseInt((max - min) / 2);
var index;
if (value == this[half])
{
//命中
return half;
}
if (value > this[half])
{
//在前半部分
return this.halfSelectByReverse(value, min, half);
}
if (value < this[half])
{
//在后半部分
return this.halfSelectByReverse(value, half, max);
}
return -1;
}
//折半查询调用
function halfSelect()
{
var value = $("selectValue").value;
var begin = new Date();
$("valueIndex1").innerHTML = all.select(value);
var end = new Date();
$("times1").innerHTML = end - begin;
}
//顺序查询调用
function sortSelect()
{
var value = $("selectValue").value;
var begin = new Date();
$("valueIndex2").innerHTML = all.sortSelect(value);
var end = new Date();
$("times2").innerHTML = end - begin;
}
</script>
</body>
</html>
转载于:https://www.cnblogs.com/lystory/archive/2008/11/11/1331132.html