javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
<span style="color: #0000ff;">function<span style="color: #000000;"> binSearch(arr,data) {
<span style="color: #0000ff;">var lowerBound = 0<span style="color: #000000;">;
<span style="color: #0000ff;">var upperBound = arr.length - 1<span style="color: #000000;">;
<span style="color: #0000ff;">while(lowerBound <=<span style="color: #000000;"> upperBound) {
<span style="color: #0000ff;">var mid = Math.floor((upperBound + lowerBound)/2);
<span style="color: #0000ff;">if(arr[mid] <<span style="color: #000000;"> data) {
lowerBound = mid + 1<span style="color: #000000;">;
}<span style="color: #0000ff;">else <span style="color: #0000ff;">if(arr[mid] ><span style="color: #000000;"> data) {
upperBound = mid - 1<span style="color: #000000;">;
}<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">return<span style="color: #000000;"> mid;
}
}
<span style="color: #0000ff;">return -1<span style="color: #000000;">;
} <span style="color: #008000;">/<span style="color: #008000;">
计算重复次数
当binSearch()函数找到某个值时,如果在数据集中还有其他相同的值出现,那么该函数会定位在类似值的附近。
换句话说,其他相同的值可能会出现已找到值的左边或右边。
如果在数据集中能找到这个值,那么这个函数将开始通过两个循环来统计这个值出现的次数。
第一个循环向下遍历数组,统计找到的值出现的次数,当下一个值与要查找的值不匹配时则停止计数。
*第二个循环向上遍历数组,统计找到的值出现的次数,当下一个值与要查找的值不匹配时则停止计数。
<span style="color: #0000ff;">function<span style="color: #000000;"> count(arr,data) {
<span style="color: #0000ff;">var count = 0<span style="color: #000000;">;
<span style="color: #0000ff;">var position =<span style="color: #000000;"> binSearch(arr,data);
<span style="color: #0000ff;">if (position > -1<span style="color: #000000;">) {
++<span style="color: #000000;">count;
<span style="color: #0000ff;">for (<span style="color: #0000ff;">var i = position-1; i > 0; --<span style="color: #000000;">i) {
<span style="color: #0000ff;">if (arr[i] ==<span style="color: #000000;"> data) {
++<span style="color: #000000;">count;
}
<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">break<span style="color: #000000;">;
}
}
<span style="color: #0000ff;">for (<span style="color: #0000ff;">var i = position+1; i < arr.length; ++<span style="color: #000000;">i) {
<span style="color: #0000ff;">if (arr[i] ==<span style="color: #000000;"> data) {
++<span style="color: #000000;">count;
}
<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">break<span style="color: #000000;">;
}
}
}
<span style="color: #0000ff;">return<span style="color: #000000;"> count;
}
<span style="color: #0000ff;">var nums = [90,43,49,15,23,2,70,20,95,69,29,26<span style="color: #000000;">];
<span style="color: #0000ff;">var list =<span style="color: #000000;"> qSort(nums);
console.log(list);
<span style="color: #0000ff;">var findnum = 23<span style="color: #000000;">;
console.log("需要查找的数据为: " +<span style="color: #000000;"> findnum);
<span style="color: #0000ff;">var retVal =<span style="color: #000000;"> binSearch(list,findnum);
<span style="color: #0000ff;">if (retVal >= 0<span style="color: #000000;">) {
console.log( "找到 " + findnum + "的位置为: "+<span style="color: #000000;">retVal);
}<span style="color: #0000ff;">else<span style="color: #000000;"> {
console.log(" is not in array."<span style="color: #000000;">);
}
console.log(findnum + "重复次数为"+count(list,findnum));