曾经研究过二分搜索的各种变种:
二分法 的 扩展
今天无意中看了下 JDK 中二分搜索的实现,确实很精巧,特别是返回插入点的设计很不错!用javascript实现下哦:
<script type="text/javascript"> /* please sort first 如果找到返回查找值所在索引 否则返回-(x+1) (插入点 x : , -(x+1) 防止 x=0的插入点 与 找到的情况矛盾)) 则判断某值是否存在只需判断 返回值 >=0 即可 */ Array.prototype.binarySearch=function(v){ var l=0; var h=this.length-1; while(l<=h) { //注:位操作javascript不一定提高效率 var m=(l+h)>>>1; if(this[m]===v) { return m; } if(this[m]>v) { h=m-1; } else { l=m+1; } } return -(l+1); } var t=[1,10,18,7,5,12,398,52]; t.sort(function(x,y){ return x-y; }); alert("Array : "+t); alert("Array : "+t+"\n"+"7 @index :"+t.binarySearch(7)); alert("Array : "+t+"\n"+"12 @index :"+t.binarySearch(12)); //重新计算得回 插入点 alert("Array : "+t+"\n"+"13 should insert :"+ (0-t.binarySearch(13)-1)) //fine ,let's insert t.splice((0-t.binarySearch(13)-1),0,13); alert("Array : "+t+"\n"+"now 13 @index :"+t.binarySearch(13)); </script>