赞
踩
类型:
算法描述
Java代码实现
/**
* 顺序查找
* @param arr:无序查找表
* @param key:待查找的关键字
* @return:关键字的索引
*/
public static int sequenceSerach(int[] arr,int key ){
for(int i=0;i<arr.length;i++){
if(arr[i]==key){
return i;//查找到返回索引
}
}
return -1;//查找不到返回-1
}
类型:
算法描述
Java代码实现
/** * 二分查找 * @param arr:有序的线性查找表 * @param key:待查找的关键字 * @return:关键字的索引 */ public static int binarySearch(int[] arr,int key){ int left=0;//有序表的第一个索引 int right=arr.length-1;//有序表第最后一个索引 while(left<=right){ int mid=(left+right)/2;//二分位置 if(arr[mid]>key){//大于则向左查 right=mid-1; }else if(arr[mid]<key){//小于则向右查 left=mid+1; } else{//等于则返回索引 return mid; } } return -1;//未查到返回-1 }
/** * @param arr:有序的线性查找表 * @param low:左边索引 * @param height:右边索引 * @param key:待查找的关键字 * @return:关键字的索引 */ public static int binarySearch(int[] arr,int low,int height,int key) { int left=low; int right=height; int mid=(left+right)/2; if(left<=right){//递归退出条件 if(arr[mid]>key){//大于则向左递归 return binarySearch(arr,low,mid-1,key); }else if(arr[mid]<key){//小于则向右递归 return binarySearch(arr,mid+1,height,key); } else{//等于则返回索引 return mid; } } return -1;未查到返回-1 }
类型
算法描述
Java代码实现
/** * 插值查找 * @param arr:有序的线性查找表 * @param key:待查找的关键字 * @return:关键字的索引 */ public static int insertionSearch(int[] arr,int key){ int left=0;//有序表的第一个索引 int right=arr.length-1;//有序表第最后一个索引 while(left<=right){ int mid=left+((key-arr[left])/(arr[right]-arr[left]))*(right-left); if(arr[mid]>key){//大于则向左查 right=mid-1; }else if(arr[mid]<key){//小于则向右查 left=mid+1; } else{//等于则返回索引 return mid; } } return -1;//未查到返回-1 }
/** * @param arr:有序的线性查找表 * @param low:左边索引 * @param height:右边索引 * @param key:待查找的关键字 * @return:关键字的索引 */ public static int insertionSearch(int[] arr,int low,int height,int key) { int left=low; int right=height; int mid=left+((key-arr[left])/(arr[right]-arr[left]))*(right-left); if(left<=right){//递归退出条件 if(arr[mid]>key){//大于则向左递归 return insertionSearch(arr,low,mid-1,key); }else if(arr[mid]<key){//小于则向右递归 return insertionSearch(arr,mid+1,height,key); } else{//等于则返回索引 return mid; } } return -1;未查到返回-1 }
预备知识
类型
算法描述
mid
的求解方式,其 mid
不再代表中值,而是代表了黄金分割点mid=low+F[k-1]-1
假如待查找表为一个数组: arr[]={0,1,2,3,4,5,6,7,8,9} 表的长度为:10 斐波那契数列:Fib={1,1,2,3,5,8,13} 表的长度为10,在在Fib中找不到为11的项。 我们怎么实现:Fib[k]-1=arr.length哪? 如果我们选择Fib=Fib={1,1,2,3,5,8},显然我们要删除部分数据,不可取 于是我们就只能选择Fib={1,1,2,3,5,8,13},此时要想斐波那契数列 最后一项的大小与表的长度有以下关系:Fib[k]-1=arr.length,我 们就只能扩充表,由于表还需要有序,因此我们使用表的最后一项来 填充即可。 注意:如果表的长度值和斐波那契数列中的某一项刚好满足:Fib[k]-1=arr.length, 此时我们就无需填充
Java代码实现
/** * 构建长度为20的斐波那契数列: * @return */ public static int[] fib(){ int[] Fib=new int[20]; Fib[0]=1; Fib[1]=1; for(int i=2;i<20;i++){ Fib[i]=Fib[i-1]+Fib[i-2]; } return Fib; } /** * 斐波那契查找: * @return:查找到返回下标(非负),未查找到返回-1 */ public static int fibinacciSearch(int[] arr,int key){ int low=0;//最小下标 int height=arr.length-1;//最大下标 int[] Fib=fib(); int k=0;//记录Fib数列的下标值 while(arr.length>Fib[k]-1){//计算最大下标对应的Fib数列位置 k++; } //不满足条件:arr.length=Fib[k]-1时,扩充数组 int [] temp= Arrays.copyOf(arr,Fib[k]); for(int i=arr.length;i<Fib[k];i++){//使用数组的最大值填充,保证有序 temp[i]=arr[height]; } //开始查找 while(low<=height){ int mid=low+Fib[k]-1;//当前分割下标 if(key<temp[mid]){//向左查找 height=mid-1; k=k-1; }else if(key>temp[mid]){//向右查找 low=mid+1; k=k-2; }else {//查找到 if(mid<=height){ return mid;//在未扩充区域查找到 }else { return height;//在扩充区域查找到 } } } return -1;//未查找到 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。