使用二进制搜索按字母顺序排序和排列

时间:2014-09-10 03:41:41

标签: java recursion binary

所以我有一个未排序单词的数组列表。我想按字母顺序对此列表进行排序。我的主要问题是我正在获得StackOver流程。另一个是当我绕过堆栈溢出时,它不会对它们进行排序。 (二进制搜索不应该对整个数组进行排序,只需给出应该添加该点的索引)。

代码:

public int binarySearch(ArrayList<String> a, String target) {
    return binarySearch(a, target, 0, a.size() - 1);
}

private int binarySearch(ArrayList<String> a, String target, int first,
        int last) {
    int mid = (first + last) / 2;
    if (first > last) {
        return first;
    }
    if (a.size() == 0) {
        return 0;
    }
    if (target.equals(a.get(mid))) {
        return mid;
    }
    if (a.get(mid).compareTo(target) > 0) {
        return binarySearch(a, target, mid - 1, last);
    }
    if (a.get(mid).compareTo(target) < 0) {
        return binarySearch(a, target, mid + 1, last);
    } else
        return mid;
}

2 个答案:

答案 0 :(得分:0)

我相信你的问题在这里:

if (a.get(mid).compareTo(target) > 0) {
    return binarySearch(a, target, mid - 1, last);
}

如果target小于你的支点,你想搜索数组的左半部分,firstmid-1

if (a.get(mid).compareTo(target) > 0) {
    return binarySearch(a, target, first, mid-1);
}

相反,你正在搜索右半部分加上左半部分的最后一个元素。

答案 1 :(得分:0)

解决方案

private int binarySearch(ArrayList<String> a, String target, int first,
        int last) {
    int mid = (first + last) / 2;
    if (first > last) {
        return first;
    }
    if (a.size() == 0) {
        return 0;
    }
    if (target.equals(a.get(mid))) {
        return mid;
    } else {
        if (a.get(mid).compareTo(target) < 0) {
            return binarySearch(a, target, mid+1,last);
        }
        else{
            return binarySearch(a,target,first,mid-1);
        }
    }
}