版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/83277813
编码实现一个类
(1)提供一个静态方法,可以将输入的一个int[]数组按照从小到大的顺序排列;
(2)提供静态方法,对排好序的数组使用折半(二分)查找(使用递归和非递归两种形式分别实现)查找某一个整数。
答案
import java.util.*;
public class Main
{
/////////////////////提供一个静态方法,可以将输入的一个int[]数组按照从小到大的顺序排列;
public static void sort(int []t)
{
for(int i=0;i<t.length-1;i++)
{
for(int j=i+1;j<t.length;j++)
{
if(t[i]>t[j])
{
int tt=t[i];
t[i]=t[j];
t[j]=tt;
}
}
}
}
/////////////提供静态方法,对排好序的数组使用折半(二分)查找(非递归)
public static int search(int []t,int tt)
{
int l=0,r=t.length-1;
while(l<=r)//别忘记等于号
{
int mid=(l+r)/2;
if(t[mid]>tt) r=mid-1;
else if(t[mid]<tt) l=mid+1;
else if(t[mid]==tt) return mid;
}
return -1;
}
/////////////提供静态方法,对排好序的数组使用折半(二分)查找(递归)
public static int Disearch(int []t,int low,int high,int o)
{
if(low>high) return -1;
int mid=(low+high)/2;
if(t[mid]>o) return Disearch(t,low,mid-1,o);//中间使用的时候,直接用t即可,不需要用[]t;
else if(t[mid]<o) return Disearch(t,mid+1,high,o);
else return mid;
}
public static void main(String[] args)
{
int []s=new int[5];
Scanner scan=new Scanner(System.in);
for(int i=0;i<5;i++)
{
int e=scan.nextInt();
s[i]=e;
}
sort(s);
for(int i=0;i<s.length;i++)
{
if(i==s.length-1) System.out.println(s[i]);
else System.out.print(s[i]+" ");
}
if(search(s,5)!=-1)
System.out.println("The position of the number is "+search(s,5));
else System.out.println("Can not find the number!");
if(Disearch(s,0,s.length,7)!=-1)
System.out.println("The position of the number is "+Disearch(s,0,s.length,7));
else System.out.println("Can not find the number!");
}
}
注意:
一、排序问题
https://blog.csdn.net/fighting123678/article/details/79573973
选择排序和冒泡排序
二、二分法
1、基本思路
- 两个数,一个l(指向一组数的队头,数值为0),一个r(指向一组数的队尾,数值为length-1)
- 取l和r的中间数mid=(l+r)/2,如果要查找的数o比中间数大的话,那么就说明o位于整体的后半段,这样直接让l=mid+1即可
- 取l和r的中间数mid=(l+r)/2,如果要查找的数o比中间数小的话,那么就说明o位于整体的前半段,这样直接让r=mid-1即可
- 按照上面的思路,不断缩小查找的范围
- 如果l>r的话,说明,直接不可能有o这个数,那么就返回-1;
- 如果l<=r的话,并且找到在mid这个位置上的数与要查找的o相同,那么就可以返回这个数的地址
2、非递归的二分法
public static int search(int []t,int tt)
{
int l=0,r=t.length-1;
while(l<=r)//别忘记等于号
{
int mid=(l+r)/2;
if(t[mid]>tt) r=mid-1;
else if(t[mid]<tt) l=mid+1;
else if(t[mid]==tt) return mid;
}
return -1;
}
(1)形参因为是一个数组,所以写法是int []t;
(2)while中,别忘记等于号
3、递归二分法
public static int Disearch(int []t,int low,int high,int o)
{
if(low>high) return -1;
int mid=(low+high)/2;
if(t[mid]>o) return Disearch(t,low,mid-1,o);//中间使用的时候,直接用t即可,不需要用[]t;
else if(t[mid]<o) return Disearch(t,mid+1,high,o);
else return mid;
}
(1)形参因为是一个数组,所以写法是int []t;
后来返回的时候,写法是t,注意写法