2017-05-14 5 views
0

과제를 수행 중이며 이진 검색을 수행해야합니다. 그러나 어떻게 든 나는 나의 선택 분류에 문제가 있다고 생각한다. 여기에 나는 Record라는 사용자 정의 클래스가있다. 그것은 다음과 같은 속성을 가지고 있습니다 :자바에서 선택 정렬을 사용하여 사용자 정의 배열을 문자열로 정렬

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

나는 그 속성에 대한 게터를 가지고 있습니다. 이제 GradeBook이라는 클래스가 있으며 여기에는 레코드의 배열이 있습니다.

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 숙박 시설 레코드를 찾기 위해 이진 검색을 수행 할 다음과 같이 나는 수동 방법이라고 loadFromTables를 통해 기록 배열을로드. 하지만 먼저 레코드 배열을 정렬해야합니다. 선택 정렬을 사용하라는 메시지가 나타납니다. 그래서, 이렇게 나는 문제가 거짓말을하지만 어디 알아낼 수없는 곳이다 생각 .. :

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; 

} 

당신은 최소의 요소를 올바르게 발견하지만 당신은 현재보다 사전 식 작은 문자열을 찾을 때 반복에서 스왑을 다하고 있습니다. 따라서이 루프에서는 최소 요소를 찾고이 루프를 실행 한 후에 swap 연산을 수행해야합니다.

수정 코드 :

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