递归二分查找
程序员文章站
2022-03-14 11:01:55
...
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class ErFen {
public static void main(String ards[])
{
System.out.println("请输入元素的个数:");
Scanner s=new Scanner(System.in);
int n=s.nextInt();
int [] a=new int [n];
for(int i=0;i<n;i++)
{
a[i]=s.nextInt();
}
Arrays.sort(a);//利用sort函数给数组a排序
System.out.println("排序后的结果是:");
for (int i : a) {
System.out.print(i+" ");
}
System.out.println();
System.out.println("请输入你要查找的数:");
int k=s.nextInt();
int t=chazhao(a,0,n-1,k);
System.out.println(t);
ArrayList<Integer> dList=chaList(a, 0, a.length, k);
System.out.println(dList);
s.close();
}
public static int chazhao(int a[],int l,int r,int val) //只找到一个就停止
{
int mid=(l+r)/2;
if(l>r)
{
return -1;
}
if(val==a[mid])
{
return mid;
}
else if(val>a[mid])
{
return chazhao(a, mid+1, r, val);
}
else {
return chazhao(a, l, mid-1, val);
}
}
//把所有符合条件的数据都找到
//思路使用集合定义一个函数,把符合的元素的位置都添加的集合
public static ArrayList<Integer> chaList(int a[],int l,int r,int val)
{
int mid =(l+r)/2;
if(l>r)
{
return new ArrayList<Integer>(); //返回空的集合,结束条件
}
if(val==a[mid])
{
ArrayList<Integer> ss=new ArrayList<Integer>();
int tem=mid-1;
while(true) //往左遍历
{
if(tem<0||a[tem]!=val)
{
break;
}
ss.add(tem); //加入集合
tem--;
}
tem=mid+1;
while(true) //往右遍历
{
if(tem>a.length-1||a[tem]!=val)
{
break;
}
ss.add(tem); //加入集合
tem++;
}
ss.add(mid);
return ss; //返回这个集合
}
else if (val>a[mid]) {
return chaList(a, mid+1, r, val);//递归调用
}
else {
return chaList(a, l, mid-1, val);//递归调用
}
}
}
上一篇: 递归——二分查找