有两种方法可以找到数据,顺序搜索和二分搜索法。顺序搜索适用于元素随机排列的列表。二分搜索法适用于有序元素列表。二分搜索法效率更高,但它必须是一组有序列表元素。
1:顺序搜索顺序搜索是从列表的第一个元素开始逐个判断列表元素,直到找到想要的结果,或者直到列表的末尾,没有找到想要的元素。
代码如下:
函数seqSearch(data,arr){ for(var I=0;一、长度;I){ if(arr[I]==data){ return true;} }返回false}我们还可以返回匹配元素位置的订单搜索函数,代码如下:
函数seqSearch(data,arr){ for(var I=0;一、长度;I){ if(arr[I]==data){ return I;} } return-1;} 2:求最小值和最大值
寻找数组中最小值的算法如下:
1.将数组的第一个元素赋给一个变量,并将这个变量作为最小值。2.开始遍历数组,并依次将其与第二个元素的当前最小值进行比较。3.如果当前元素的值小于当前最小值,则将当前元素设置为新的最小值。4.移动到下一个元素并重复步骤3。5.当程序结束时,最小值存储在这个变量中。
代码如下:
函数find MIn(arr){ var MIn=arr[0];for(var I=1;一、长度;I){ if(arr[I]min){ min=arr[I];} }返回分钟;}求最大值的算法与上面的最小值类似。首先,将数组中的第一个元素设置为最大值,然后循环比较数组中剩余的每个元素与当前最大值。如果当前元素的值大于当前最大值,则将此元素的值赋给最大值。代码如下:
函数FindMax(arr){ var max=arr[0];for(var I=1;一、长度;I){ if(arr[I]max){ max=arr[I];} }返回最大值;} 3:二分搜索法法。
如果您正在寻找的数据是有序的,二分搜索法算法比顺序搜索算法更有效。二分搜索法算法的基本原理如下:
1.将数组的第一个位置设置为下边界(0)。2。将数组最后一个元素的位置设置为上边界(数组长度减1)。3.如果下边界等于或小于上边界,请执行以下操作:a .将中点设置为(上边界加下边界)除以2.b .如果中点元素小于查询值,将下边界设置为中点元素的下标加1.c .如果中点元素大于查询值,将上边界设置为中点元素的下标减1.d .否则,中点元素是要搜索的数据,可以返回。
代码如下:
//二分搜索法算法函数binsearch (data,arr) {var下界=0;var upper bound=arr . length-1;while(lowerBound=upper bound){ var mid=math . floor((upper bound lowerBound)/2);if(arr[mid]数据){ lowerBound=mid 1;} else if(arr[mid]data){ upper bound=mid-1;} else { return mid} } return-1;}//快速排序函数qsort (list) {if (list)。length==0){ return[];}//存储小于参考值的值var left=[];//存储大于参考值的值var right=[];var pivot=list[0];for(var I=1;一、清单.长度;I){ if(list[I]pivot){ left . push(list[I]);} else { right . push(list[I])} } return qSort(左)。concat(pivot,qSort(右));}//测试代码var numbers=[0,9,1,8,7,6,2,3,5,4];var list=qSort(numbers);console.log(binSearch(6,list));4.计算重复次数;当二分搜索法算法binSearch()找到某个值时,如果数据集中有其他相同的值,函数将定位在相似值附近,换句话说,其他相同的值可能出现在找到的值的左侧或右侧。
那么我们最简单的方案就是写两个循环,一个是同时向下或者向左遍历数据集,并统计重复次数;然后,向上或向右移动,并计算重复的次数。代码如下:
//计算重复次数函数计数(数据,arr){ var count=0;var arrs=[];var position=binSearch(数据,arr);如果(位置-1){ count;艾瑞斯。push({ ' index ' : count });对于(var i=位置-1;I 0;- i) { if(arr[i]==数据){ countarrs。push({ ' index ' : count });} else { break} } for(var i=位置1;一、长度;i) { if(arr[i]==数据){ countarrs。push({ ' index ' : count });} else { break} } }返回arrs} //测试重复次数的代码var arr=[0,1,1,1,2,3,4,5,6,7,8,9];var arrs=count(1,arr);控制台。日志(arrs);控制台。日志(arrs。长度);如下图所示: