2017-05-14 37 views
0

我正在处理任务,并且需要执行二分搜索。但不知何故,我认为我的选择排序有问题。这里我有一个用户定义的类叫做Record。它具有以下属性:使用java中的选择排序按字符串对用户定义的数组进行排序

class Record{ 
    String studentId; 
    int assignment; 
    int exam; 
    int total; 
    String grade; 
} 

我有这些属性的getters。现在有另一个类GradeBook其中有一个类型的阵列记录。我通过一种称为loadFromTables手动加载记录阵列如下:

private void loadFromTables(){ 

    String[] students = { 
     "S10","S20","S30","S40","S50", "S60", 
     "S08","S18","S28","S38","S48", "S58", 
     "S06","S16","S26","S36","S46", "S56", 
    }; 

    int[] assignment = { 
     0, 10, 20, 30, 30, 40, 
     0, 10, 20, 30, 30, 40, 
     0, 10, 20, 30, 30, 40, 
    }; 

    int[] exam = { 
     0, 39, 44, 44, 54, 59, 
     1, 40, 45, 45, 55, 60, 
     2, 41, 46, 46, 56, 58, 
    }; 

    nrecords = students.length; 
    gradeBook = new Record[nrecords]; 

    for (int i = 0; i < nrecords; i++) { 

     int t = assignment[i] + exam[i]; 
     String g = calculateGrade(t); 
     Record r = new Record(students[i], assignment[i], exam[i], t, g); 
     gradeBook[i] = r; 

    } 


} 

现在我想要做的二进制搜索酒店所studentId找到一个记录。但首先我必须对记录阵列进行排序。我被告知要使用选择种类。所以,我这样做,我觉得这是问题所在,但我似乎无法找出其中..:

private void sortById(){ 

    //Selection Sort 

    for(int i=0; i<nrecords-1; i++){ 

     int index = i; 

     for(int j=i+1; j<nrecords; j++){ 

      if((gradeBook[index].studentId).compareTo(gradeBook[j].studentId) > 0){ 

       index = j; 

      } 

      Record temp = gradeBook[i]; 
      gradeBook[i] = gradeBook[index]; 
      gradeBook[index] = temp; 

     } 

    } 

} 

这里是我以前虽然我认为二进制搜索的代码二进制搜索已正确实施。因为我试图用冒泡排序这样做,那正是我想要的。

public Record find(String id){ 

    //Binary Search 

    int low = 0; 
    int high = nrecords - 1; 
    Record record = null; 

    while(low <= high){ 

     int mid = (high + low)/2; 

     if(id.compareTo(gradeBook[mid].studentId) == 0){ 

      record = new Record(id, gradeBook[mid].assignment, gradeBook[mid].exam, gradeBook[mid].total, gradeBook[mid].grade); 
      return record; 

     } 
     else if(id.compareTo(gradeBook[mid].studentId) > 0){ 

      low = mid + 1; 

     } 
     else if(id.compareTo(gradeBook[mid].studentId) < 0){ 

      high = mid - 1; 

     } 

    } 

    return record; 

} 

在此先感谢。我知道问题在于选择,它正在吃掉我的头。感谢您的建议! :)

回答

1

在选择排序中,我们首先遍历子数组,然后在子数组中找到最小元素,然后在每次迭代中最后一个元素为当前和最小元素Swap

代码中的问题在这里。

for(int j=i+1; j<nrecords; j++){ 

    if((gradeBook[index].studentId).compareTo(gradeBook[j].studentId) > 0){ 
      index = j; 
    } 

    Record temp = gradeBook[i]; 
    gradeBook[i] = gradeBook[index]; 
    gradeBook[index] = temp; 

} 

你已经找到最小元素正确,但是当你发现比当前的词典式小串你正在做的迭代互换。所以在这个循环中,你只需要找到最小的元素,并且应该在执行这个循环之后完成操作。

更正代码:

private void sortById(){ 

    //Selection Sort 

    for(int i=0; i<nrecords-1; i++){ 

     int index = i; 

     for(int j=i+1; j<nrecords; j++){ 

      if((gradeBook[index].studentId).compareTo(gradeBook[j].studentId) > 0){ 

       index = j; 

      } 

      Record temp = gradeBook[i]; 
      gradeBook[i] = gradeBook[index]; 
      gradeBook[index] = temp; 

     } 

    } 

} 
+0

你纠正代码包含同样的事情,因为我写的,但解释是伟大的。谢谢你,将它标记为答案!它确实解决了我的问题! – Arefin

相关问题