我的任务是编写1/4 - 3/4二进制搜索算法修改,其中第一个元素在搜索列表中的项目时进行比较,是' pivot'元素距离的1/4 列表的一端(假设选择的结尾是剩下的' 列表)。如果没有匹配(' pivot'元素不等于搜索键)和 如果列表中应进一步检查以进行搜索的部分是1/4 列表的一部分,继续采用相同的策略。每当部分 应进一步检查搜索的列表大小为3/4,切换到 二次搜索一次并返回1 / 4th-3/4策略。 我的代码在这里,但它不起作用,即使我做得对,我也不知道:
public static int ThreeFour(int[] Array,int item)
{
int counter =0;
int high=Array.length-1;
int low=0;
int pivot = 0;
boolean split = true;
boolean last =true;
while(high >= low) {
if(split){
pivot = (high+low)/4;
last=true;}
else
{ pivot = (high+low)/2;
split=true;
last=false;
}
if(Array[pivot] == item)
{ counter++;
System.out.println("Pivot"+pivot);
return counter;
}
if(Array[pivot] < item) {
low = pivot + 1;
counter++;
}
if(Array[pivot] > item) {
high = pivot - 1;
counter++;
if (last)
split=false;
}
}
return 0;
}
它不起作用,也许有一个更简单的策略来做到这一点?最困难的部分是让它记住它已经分成两半:/
答案 0 :(得分:1)
确定枢轴的公式对于3/4分割来说是错误的。如果您希望在low
与[{1}}的某个时间点high
之间区分c
和0 <= c <=1
之间的间隔,则会得到:
pivot = low + c * (high - low)
= (1 - c) * low + c * high
这将为low
提供c == 0
,为high
提供c == 1
以及为您的3/4分割提供
pivot = 0.75 * low + 0.25 * high
或者,使用整数运算:
pivot = (3 * low + high) / 4
特别是,low
和high
的因素应总计为1。
我还认为你的函数有一个逻辑错误:你返回递归深度,这对数组没有意义。您应该返回数据透视表,即找到该项目的数组索引。这也意味着你无法在失败时返回0,因为那是一个有效的数组索引。返回一个非法索引,如-1,表示该项目未找到。