顺序搜索原理按顺序比较特定元素和序列中的元素,直到找到与特定关键字相同的元素,或者同时比较序列中的元素。
代码实现//顺序搜索代码实现在找到满意的值时显示publicclassseqsearch { publicstaticvoidmain (string [ ] args ) int [ ] arr={ 12,9,- 9,7770 intindex=序列搜索(arr,-9); if(index==-1 ) { System.out.println ('找不到); }发现}else { System.out.println ('下标为' index ); } publicstaticintsequencesearch (int [ ] arr,int value ) /遍历数组查找for ) intI=0; i arr.length; I ) (/如果找到,则为下标if(arr[I]==value ) ) {返回I; //如果找不到,返回- 1返回- 1; }运行结果
算法分析优点:
对检测序列(表)无要求的——检测对象序列可以有序,也可以无序; 从第一个元素开始。如果必须逐个遍历整个要检查的序列(除非找到),但找不到最后一个元素,则搜索失败。缺点:低效——等待检验序列时间复杂度:
o(n ),平均寻道时间=列表长度/2
空间复杂度:
一个待检序列一个目标元素=o(n ) ) ) ) ) ) ) ) ) ) ) ) )。
二分搜索二分搜索又称折半搜索(Binary Search ),是一种高效的搜索方法。 但是,在往返搜索中,路线表必须是顺序存储结构,表中的元素必须按关键字排序。
在原理分析中,首先确定数组中间的下标mid=(leftright )/2。 然后,将需要查找的数量的value与arr[mid]进行比较。 valuearr[mid]表示要搜索的数量位于mid的右侧,因此必须递归向右搜索。 valuearr[mid]表示要搜索的数量在mid的左侧,因此必须递归地向左搜索。 找到value==arr[mid]说明后,返回。 什么时候结束递归?
1 )找到后结束递归。
2 )递归完整数组,如果尚未找到value,需要退出递归并成为left right,则必须退出。
代码实现//二分查找: publicclassbinarysearch { publicstaticvoidmain (string [ ] args )//数组int [ ] arr={-} if(resultindex==-1 ) { System.out.println (找到的值不在数组中) }; }发现}else { System.out.println ('下标为' resultIndex ' ); }//left左侧的索引right右侧的索引value要搜索的值publicstaticintbinarysearch (int [ ] arr、int left、int right、int value ) /递归(//中间索引和值intmid=)左右)/2; int midValue=arr[mid]; if(valuemidvalue(//右递归returnbinarysearch(arr,mid 1,right,value ) ); }elseif(valuemidvalue ) (//向左递归返回returnbinarysearch ) arr,left,mid-1,value ); else {返回mid; }}运行结果
算法分析优点
比较次数少,检索速度快,平均性能好;缺点
要求核对表规则,插入删除困难。 因此,混叠搜索方法适于在不频繁改变的情况下搜索频繁有序列表。
时间复杂度:
最坏的情况是两种方式的时间复杂度相同。 o(log2n )最佳情况为o )1)空间复杂度:
非递归方式:辅助空间为常数级,因此空间复杂度为o(1);
递归方式:递归的次数和深度都为log2 N,每次所需的辅助空间为常数级:
空间复杂性: o(log2n ) ) ) )。