二进制 Search/Insert 方法未正确插入
Binary Search/Insert Methods not inserting correctly
我需要一个按字母顺序排序的学生数据库,因此我决定通过正确插入学生来保持他们的排序。因此,我决定使用插入方法实现二分查找,以在插入时保持排序。
但是,由于某种原因,它插入不正确,数据库不再排序。我知道这与我使用 .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。
感谢 Joop Eggen!
我需要一个按字母顺序排序的学生数据库,因此我决定通过正确插入学生来保持他们的排序。因此,我决定使用插入方法实现二分查找,以在插入时保持排序。
但是,由于某种原因,它插入不正确,数据库不再排序。我知道这与我使用 .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。
感谢 Joop Eggen!