js 折半查找

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值