二进制搜索/插入方法未正确插入



我需要有一个按字母顺序排序的学生数据库,所以我决定通过正确插入学生来保持学生的排序。所以我决定使用插入方法实现二叉搜索,以在插入时保持排序。

但是,由于某种原因,它插入不正确,并且数据库不再排序。我知道这与我使用 .compareToIgnoreCase(( 方法的逻辑有关。这是我的代码:

private Student[] binaryInsert(Student student, int min, int max) {
    int mid = (min + max) / 2;
    if (min > max) {
        return insert(studentDatabase, student, -1);
    }
    if (min == max) {
        if (studentDatabase[mid].compareToIgnoreCase(student)) < 0) {
            return insert(studentDatabase, student, mid + 1);
        } else {
            return insert(studentDatabase, student, mid - 1);
        }
    } else if (studentDatabase[mid].compareToIgnoreCase(student)) < 0) {
        return binaryInsert(student, mid + 1, max);
    } else {// last possibility: a[mid] > x
        return binaryInsert(student, min, mid - 1);
    }
}
public Student[] insert(Student[] database, Student object, int i) {
    Student[] newDatabase = new Student[database.length + 1];
    if (i == -1) {
        for (int j = 1; j < newDatabase.length; j++) {
            newDatabase[j] = database[j - 1];
        }
        newDatabase[0] = object;
    } else {
        for (int x = 0; x < i; x++) {
            newDatabase[x] = database[x];
        }
        newDatabase[i] = object;
        for (int x = i + 1; x < newDatabase.length; x++) {
            newDatabase[x] = database[x - 1];
        }
    }
    return newDatabase;
}

和我的输入:

STUDENT/NAD86/RAFAEL/NADAL/1986/SPAIN
STUDENT/DJO87/NOVAK/DJOKOVIC/1987/SERBIA
STUDENT/FED81/ROGER/FEDERER/1981/SWITZERLAND
STUDENT/STA86/ALEX/STAIRS/1998/AMERICA

和我的输出

FED81: ROGER FEDERER, 1981, SWITZERLAND, 0.0
DJO87: NOVAK DJOKOVIC, 1987, SERBIA, 0.0
NAD86: RAFAEL NADAL, 1986, SPAIN, 0.0
STA86: ALEX STAIRS, 1998, AMERICA, 0.0

FED81是问题儿童。如果我重新排列输入,它确实有效,但我不能这样做。

提前感谢您的帮助!

编辑:应该注意的是,我尝试了相同的过程,但使用了整数,并且在我所有的测试中都有效。

感谢Joop Eggen,我能够让它工作。解决方案是从insert(studentDatabase, student, mid - 1)方法调用中删除"- 1"。

修复是由于 a[i] 之前的插入点位于 i,而不是 i - 1。

感谢乔普·埃根!

最新更新