Java三分查找(有序数组)
二分查找是确定一个中心点,将数据分为两半,每次减少一半数据
三分查找确定两个中间点,将数据分为三半,每次减少三分之二数据
public static void main(String[] args) {
int[] a = {1,3, 4, 5, 6, 8, 9, 10};
/*
注意这里传进去的high = a.length;
否则会查询不到最后一个元素
*/
int index = threesearch(a,8);
int index1 = threesearch_one(a,10,0,8);
if (index != -1) {
System.out.println("循环得出关键字8的下标为" + index);
System.out.println("递归得出关键字10的下标为" + index1);
} else {
System.out.println("没有找到~~~");
}
}
//循环写法
public static int threesearch(int []a,int key)
{
int mid1 = 0;
int mid2 = 0;
int low = 0;
int high = a.length;
int times = 0;
while(low <= high)
{
mid1 = (high -low)/3+low;
mid2 = 2*(high -low)/3+low;
//如果关键字不在数组范围内,直接返回搜索不到
if(a[low]>key || a[high-1]<key){
break;
}
//如果关键字在三分之一点处
else if(a[mid1] == key)
{
return mid1;
}
//如果关键字在三分之二点处
else if(a[mid2] == key)
{
return mid2;
}
//如果关键字小于三分之一点处的值,则关键字在左侧三分之一中查找
else if(a[mid1] > key)
high= mid1;
//如果关键字在两个三分点之间,则确定中间区间
else if(a[mid1] < key && a[mid2] > key)
{
low = mid1;
high = mid2;
}
//最后一种情况就是在三分之二分点右侧
else low = mid2;
}
return -1;
}
//递归写法
public static int threesearch_one(int []a,int key,int low,int high)
{
int mid1 = (high -low)/3+low;
int mid2 = 2*(high -low)/3+low;
if(low>high) {
return -1;
}
if(a[mid1] == key)
{
return mid1;
}
//如果关键字在三分之二点处
else if(a[mid2] == key)
{
return mid2;
}
//如果关键字小于三分之一点处的值,则关键字在左侧三分之一中查找
else if(a[mid1] > key)
return threesearch_one(a,key,low,mid1);
//如果关键字在两个三分点之间,则确定中间区间
else if(a[mid1] < key && a[mid2] > key)
{
return threesearch_one(a,key,mid1,mid2);
}
//最后一种情况就是在三分之二分点右侧
else return threesearch_one(a,key,mid2,high);
}
结果:
(注意:这里的算法只适用于有序数组,无序或先升后降之类的不适用)