一种结合线性搜索和二分搜索的搜索算法

时间:2016-04-13 13:53:32

标签: java algorithm search

正如标题所说,我想制作一个结合了linearSearch和binarySearch的搜索算法。如果数组少于20个元素,我想使用linearSearch,否则使用二进制搜索。

- 数组应该排序。

- 数组是Comparable类型的元素。

- 算法应返回找到元素的索引,否则应返回-1

我的代码,但我有点卡住..我是在正确的轨道上吗?

public class SearchAlgorithm<T extends Comparable<T>> {

public int linearSearch(T[] Array, T find){
    int temp = 0; 
    for(int i = 0; i < Array.length; i++){
        if(Array[i] == find){
            temp = i;
        }
        else{
            temp = -1;
        }
    }
    return temp;

}
public int binarySearch(T[] Array, T find){
    int lowIdx = 0;
    int highIdx = Array.length-1;
    int middleIdx = 0;

    while(lowIdx <= highIdx){
        middleIdx = (highIdx + lowIdx)/2;
        int comp = find.compareTo(Array[middleIdx]);

        if(comp < 0)
            lowIdx = middleIdx + 1;

        else if(comp > 0)
            highIdx = middleIdx -1;

        else{
            lowIdx = highIdx+1;
            return middleIdx;
        }
    }
    return -1;
}
public void combinedSearch(T[] Arr, T find){
    long startTime = System.currentTimeMillis();
    if(Arr.length < 20){
        linearSearch(Arr,find);
    }
    else{
        binarySearch(Arr,find);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("combinedSearch took: "+(endTime-startTime)+ "ms");
}
public static void main(String[] args){
    int[] a = {1,2,3,4,5};
    binarySearch(a,4);
}

}

1 个答案:

答案 0 :(得分:0)

用于线性搜索

if(Array[i] == find){
        temp = i;
    }
    else{
        temp = -1;
    }

每次不匹配时将其设置为-1。它应该是这样的:

int temp = -1; 
for(int i = 0; i < Array.length; i++){
    if(Array[i] == find){
        temp = i;
        return temp;
    }
}
return temp;

同样对于二进制搜索,您应该反转比较。你发现的数字是左半部分,如果它小于中等,等等。

if(comp > 0)
        lowIdx = middleIdx + 1;

    else if(comp < 0)
        highIdx = middleIdx -1;