1折半查找技术:简称为二分查找技术。它的前提是,线性表中的记录必须是关键字有序,通常是从小到大有序,线性表必须采用顺序存储。思想:取中间记录为比较对象,若给定值与中间记录的关键字相等,则查找成功。若给定值小于中间记录关键字,则在中间记录的左半区继续查找;若大于中间记录关键字,则在右半区继续查找,直到成功为止。
2插值插值
在二分查找中,mid=(low+high)/2=low+1/2*(high-low)
而改进后
mid=low+(key-arr[low])/(arr[high]-arr[low])(high-low);
对于较大的表,大大提高性能
3斐波拉切查找,利用黄金分割原理,即如果要查找的记录在右侧,则左侧的数据都不用判断了,不断反复进行下去。
package Search;
public class BinarySearch {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[]={0,1,16,24,35,47,59,62,73,88,99,0,0,0};
int temp=Fibonacci_search( arr,10,99);
if(temp!=0)
{
System.out.println("查找成功"+temp);
}
else
System.out.println("查找失败");
}
//二分查找算法
public static int Binary_Search(int arr[],int n,int key)
{
int low,high,mid;
low=1;//最低元素索引
high=n;//最高元素索引
int flag=0;//哨兵用来记录查找次数
while(low<=high)
{
mid=(low+high)/2;
if(key<arr[mid])
{
high=mid-1;
flag++;
}
else if(key>arr[mid])
{
low=mid+1;
flag++;
}
else
return mid;
}
return 0;
}
//改进的二分查找算法
public static int chazhiSearch(int arr[],int n,int key)
{
int low,high,mid;
low=1;//最低元素索引
high=n;//最高元素索引
while(low<=high)
{
//关键算法,效率提高不少
mid=low+(high-low)*(key-arr[low])/(arr[high]-arr[low]);
if(key<arr[mid])
high=mid-1;
else if(key>arr[mid])
low=mid+1;
else
return mid;
}
return 0;
}
//斐波拉切查找算法,
public static int Fibonacci_search(int arr[],int n,int key)
{
//构造一个斐波拉切数列
int F[]=new int[20];
F[0]=0;
F[1]=1;
for(int j=2;j<F.length;j++)
{
F[j]=F[j-1]+F[j-2];//递归构造斐波拉契数列
}
int low,high,mid,i,k;
low=1;
high=n;
k=0;
while(n>F[k]-1)
k++;
for(i=n;i<F[k]-1;i++)
arr[i]=arr[n];//必须扩展对象数组的后面几位元素,否则容易越界
while(low<=high)
{
mid=low+F[k-1]-1;
if(key<arr[mid])
{
high=mid-1;
k=k-1;
}
else if(key>arr[mid])
{
low=mid+1;
k=k-2;
}
else
{
if(mid<=n)
return mid;
else
return n;
}
}
return 0;
}
}
转载于:https://blog.51cto.com/liuzhangheng/1404202