当前位置: 首页 > 后端技术 > Java

Java版数据结构与算法(一)

时间:2023-04-01 20:53:50 Java

PS:本文为转载文章,原文可读性会更好,文末有原文链接ps:本文写了线性搜索算法、二分搜索算法和插值搜索算法。1.线性搜索算法线性搜索算法是最简单的搜索算法。它的思想是遍历一组有序或无序的序列,并逐一比较。如果要查找的值等于序列中的某个值,则证明已经找到,返回该值在序列中的索引;如果遍历序列后要查找的值没有相等的值,则返回-1。举个例子,假设有一个int类型的数组a={2,4,3,5,1,8,9},我们从这个数组a中找出1和0,那么代码如下:publicclassTest8{/**@paramargs*/publicstaticvoidmain(String[]args){int[]a={2,4,3,5,1,8,9};intresult=linearSearch(a,1);intresult2=linearSearch(a,0);System.out.println(result==-1?"1notfound":("1在数组a中的位置是:"+result));系统输出。println(result2==-1?"No0found":("数组a中0的位置是:"+result2));}/**@paramarrArraytofind@paramfindValValuetofind@return返回数组中对应值的下标,如果不为-1*/publicstaticintlinearSearch(int[]arr,intfindVal){int结果=-1;if(arr==null||arr.length<=0){result=-1;}else{for(inti=0;iend,证明没有找到对应的元素,循环停止。下面举个例子详细分析一下。假设我有一个有序序列,数组的大小a={1,2,3,4,5,6,7,8,9,10},一开始start=0,end=9,mid=(start+end)/2=(0+9)/2=4,a[mid]=a[4]=5.2,1假设找到4(1)因为4a[mid]=a[1]=2,将start移到mid位置的右侧,start=mid+1=1+1=2。(3)重新计算mid,mid=(start+end)/2=(2+3)/2=2;因为4>a[mid]=a[2]=3,将start移到mid位置的右边,start=mid+1=2+1=3。(4)重新计算mid,mid=(start+end)/2=(3+3)/2=3;因为4=a[mid]=a[3]=4,已经找到了,退出循环。2,2假设求11(1)因为11>a[mid]=a[4]=5,所以把start移到mid的右边,start=mid+1=4+1=5。(2)重新计算中间,中间=(开始+结束)/2=(5+9)/2=7;因为11>a[mid]=a[7]=8,所以将start移到mid位置的右边,start=mid+1=7+1=8。(3)重新计算mid,mid=(start+end)/2=(8+9)/2=8;因为11>a[mid]=a[8]=9,将start移到mid位置的右侧,start=mid+1=8+1=9。(4)重新计算mid,mid=(start+end)/2=(9+9)/2=9;因为11>a[mid]=a[9]=10,把start移到mid位置的右边,start=mid+1=9+1=10。(5)start=10,end=9,start>end,表示没有找到,所以退出循环。让我们用代码来实现它:publicclassTest8{publicstaticvoidmain(String[]args){int[]a={1,2,3,4,5,6,7,8,9,10};binarySearch(a,4);binarySearch(a,11);}privatestaticintbinarySearch(int[]a,intfindValue){intresult=-1;if(a!=null&&a.length>0){int中=0;int开始=0;intend=a.length-1;while(true){mid=(start+end)/2;if(start>end){System.out.println("未从数组中检索到一个find"+findValue);休息;}elseif(findValue>a[mid]){start=mid+1;}elseif(findValuefindValue或者findValue>arr[arr.length-1]这两个条件是否为真,如果不为真,则计算mid,比较findValue和mid,如果相等,则证明有被找到,并退出循环;如果findValue小于arr[mid],则设置end=mid-1,即将end移动到mid左边的位置,重新计算mid;如果小于arr[mid]]大,则设start=mid+1,即把start移到mid右边的位置,重新计算mid;循环查找,直到start>end,证明没有找到对应的元素,则停止循环。下面举个例子详细分析一下。假设我有一个数组arr={2,12,22,32,42,52,62,72,82,92},start=0,end=9。3.1假设搜索82(1)arr[0]>findValueorfindValue>arr[arr.length-1]这两个条件都不成立,则计算mid,mid=start+(end-start)(findValue-arr[start])/(arr[end]-arr[start])=0+(9-0)(82-2)/(92-2)=8。(2)做比较,mid=8,findValue=arr[8]=82,head2已经找到,退出循环。3.2假设查找是102(1)findValue>arr[arr.length-1]=arr[9]=92,所以证明没有找到,查找结束。让我们用代码来实现它:publicclassTest8{publicstaticvoidmain(String[]args){int[]arr={2,12,22,32,42,52,62,72,82,92};insertSearch(arr,82);insertSearch(arr,102);}publicstaticintinsertSearch(int[]arr,intfindValue){int结果=-1;if(arr!=null&&arr.length>0){if(findValuearr[arr.length-1]){System.out.println("在arr数组中找不到"+findValue);}else{int开始=0;int结束=arr。长度-1;int中间=0;整数计数=0;while(true){计数++;System.out.println("th"+count+"search");mid=start+(end-start)*(findValue-arr[start])/(arr[end]-arr[start]);if(start>end){System.out.println("在arr数组中找不到"+findValue);休息;}elseif(findValue>arr[mid]){start=mid+1;}elseif(findValue