【发布时间】:2013-12-14 10:08:45
【问题描述】:
我是当地一所大学的二年级学生,目前正在学习计算机编程课程。我在我的编程课上做得很好,虽然我通常会遇到问题。我们的教授给了我们一些不完整的算法,他希望我们完成这些算法作为另一个诊断测试。他事先告诉我们,必须不使用捷径,也就是说我不能使用比较器,只能使用冒泡、插入、选择和归并排序等基本排序算法,只能使用二分或线性搜索。
我收到了一份不完整的文件,用于对学生及其分数进行排序。我一直想出的一个特殊问题是我需要创建的排序算法和搜索算法。我们的讲师给了我们一些测试材料,看看我们的算法是否有效。令人惊讶的是,我的没有。我尝试了所有类型的排序算法,但由于某种原因,测试表明算法失败了。我该如何解决这个困境。
操作系统:Windows 7, Java 工作台:Eclipse
这是算法的代码。如果它看起来很混乱,我很抱歉。 这是目前的排序算法。假定的设计(由我的教授)是数组将按降序排序。
public static void sort(Student[] students) {
if(students == null)
return;
for(int i=0;i<students.length-2;i++){
Student temp = students[i];
for(int k=i+1;k<students.length-1;k++){
Student temp2= students[k];
int result = temp2.compareTo(temp);
if(result > 0){
students[k] = temp;
students[i] = temp2;
}
}
}
}
这里是搜索算法的代码。同样,假定的设计是能够使用字符串“name”搜索学生的名字和姓氏。该算法将以某种方式进行,即它会忽略名称的格式,例如“lastname firstname”和“firstname lastname”,并且它会忽略大写字母。再次为混乱的工作道歉。
public static int search(Student[] students, String name) {
if(students == null || students.length == 0)
return -1;
for(int i=0;i<students.length;i++){
name.toLowerCase();
if(name.compareTo(students[i].getGivenName().toLowerCase()+" "+students[i].getFamilyName().toLowerCase()) == 0 || name.compareTo(students[i].getFamilyName().toLowerCase()+" "+students[i].getGivenName().toLowerCase()) == 0)
return 1;
}
return -1;
}
所以,总而言之,如果你跳到最后,我的问题是:我的排序算法做错了什么,有没有更好、更简单的方法来缩短搜索算法,同时仍能正常工作
编辑:这里分别是排序和搜索算法的测试算法。测试排序算法可以按照我做的排序算法,但是由于某种原因它没有通过教授制定的布尔条件。
public void testSort() throws OutOfRangeException, FileNotFoundException {
Student[] students = new Student[6];
students[0] = new Student("joey", "mitchel", new int[]{42,51,64,70,81});
students[1] = new Student("Sandy", "luchel", new int[]{64,51,64,70,81});
students[2] = new Student("Sandy", "luchel", new int[]{42,51,64,70,81});
students[3] = new Student("amanda", "jones", new int[]{95,51,64,70,81});
students[4] = new Student("Susane", "Louis", new int[]{42,51,64,70,81});
students[5] = new Student("Samuel", "jones", new int[]{95,51,64,70,81});
StudentSearcherSorter.sort(students);
for(int i=0; i<students.length - 1; i++) {
boolean b1 = students[i].total() > students[i+1].total();
boolean b2 = false;
boolean b3 = false;
if(b1 == false && students[i].total() == students[i+1].total())
b2 = students[i].getFamilyName().compareTo(students[i+1].getFamilyName()) < 0;
if(b2 == false && students[i].total() == students[i+1].total() && students[i].getFamilyName().compareTo(students[i+1].getFamilyName()) == 0)
b3 = students[i].getGivenName().compareTo(students[i+1].getGivenName()) < 0;
assertTrue(b1 || b2 || b3);
}
}
和搜索测试算法。我不确定出了什么问题,虽然一般来说,这可能与我处理搜索算法代码的方式有关。
public void testSearch() throws FileNotFoundException, OutOfRangeException {
Student[] students = new Student[6];
students[0] = new Student("joey", "mitchel", new int[]{42,51,64,70,81});
students[1] = new Student("Sandy", "luchel", new int[]{64,51,64,70,81});
students[2] = new Student("Sandy", "luchel", new int[]{42,51,64,70,81});
students[3] = new Student("amanda", "jones", new int[]{95,51,64,70,81});
students[4] = new Student("Susane", "Louis", new int[]{42,51,64,70,81});
students[5] = new Student("Samuel", "jones", new int[]{95,51,64,70,81});
for(int i=0; i<students.length; i++) {
assertTrue(StudentSearcherSorter.search(students, students[i].getGivenName().toUpperCase()+" "+students[i].getFamilyName()) >= 0);
assertTrue(StudentSearcherSorter.search(students, students[i].getFamilyName()+" "+students[i].getGivenName().toUpperCase()) >= 0);
}
}
【问题讨论】:
-
对于您的搜索算法,
Strings是不可变的。即它应该是name = name.toLowerCase(); -
如果我将其作为实际程序的一部分而不是作为练习,我会编写一个 Comparator
以忽略大小写以降序比较字符串。在 Arrays.sort 和 Arrays.binarySearch 中使用该比较器。 -
@PatriciaShanahan,这不会教学生任何关于排序和搜索的知识。
标签: java arrays algorithm sorting object