1.顺序查找:顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。
主函数部分
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String[] str=null;//首先定义一个字符数组,获取长度。
str=input.nextLine().split(" ");
int k=input.nextInt();//查找的数值k
int[] a=new int[str.length];
for(int i=0;i<a.length;i++) {
a[i]=Integer.valueOf(str[i]);//字符数组转化为整数数组
}
FindNum f=new FindNum();
f.Sequence(a, k);//访问顺序查找
System.out.println("\n");
f.Binary(a, k);//访问二分查找
System.out.println("\n");
f.Insert(a, k);//访问插值查找
}
顺序查找,数组的排序没有要求
class FindNum{
//顺序查找
static void Sequence(int[] a,int k) {
int flag=-2;
for(int i=0;i<a.length;i++) {
if(a[i]==k)
flag=1;
}
System.out.println("找到数值"+k+"了!");
if(flag==-2)
System.out.println("没有找到数值"+k+"!");
}
二分查找,查找前需要对数组进行排序。先找出有序集合中间的那个元素。如果此元素比要查找的元素大,就接着在较小的一个半区进行查找;反之,如果此元素比要找的元素小,就在较大的一个半区进行查找。在每个更小的数据集中重复这个查找过程,直到找到要查找的元素或者数据集不能再分割。
static void Binary(int[] a,int k) {
int right=0,left=a.length-1;
int flag=-2;//定义标记是否查找到数值k,找不到为flag=-2
while(right<=left) {
int mid=(right+left)/2;
if(k==a[mid]) {
System.out.println("找到了,在"+(mid+1)+"位置");
flag=1; //标记为1,在数组中找到数值k,并且跳出循环
break;
}else if(k>a[mid]) {//如果查找的数值k大于中间值,右半部分舍弃
right=mid+1;
}else {//如果查找的数值k小于中间值,左半部分舍弃
left=mid-1;
}
}
if(flag==-2) {
System.out.println("没有找到该数值!");
}
}
插值查找,查找前数组需要进行排序。mid= left + (right - left) * (key - arr[left])/(arr[right] - arr[left])
static void Insert(int[] a,int k) {
int flag=-2;
int right=0,left=a.length-1;
while(right<=left) {
int mid=right+(k-a[right])/(a[left]-a[right])*(left-right);
if(a[mid]==k) {
System.out.println("在数组中找到数值"+k);
flag=1;
break;
}else if(a[mid]>k) {
left=mid-1;
}
else {
right=mid+1;
}
}
if(flag==-2)
System.out.println("没有找到数值"+k);
}
}