Сортировка пользовательского массива по строке с использованием сортировки выбора в java

Я работаю над заданием, и мне нужно выполнить двоичный поиск. Но почему-то я думаю, что у меня проблемы с сортировкой выбора. Здесь у меня есть определенный пользователем класс под названием Record. Он имеет следующие свойства:

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

У меня есть геттеры для этих свойств. Теперь есть еще один класс с именем GradeBook, в котором есть массив типа Record. Я вручную загрузил массив записей с помощью метода 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;

}

Заранее спасибо. Я знаю, что проблема в сортировке выбором, и она ест мою голову. Цените ваши предложения! :)


person Arefin    schedule 14.05.2017    source источник


Ответы (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;

        }

    }

}
person Sanket Makani    schedule 14.05.2017
comment
Ваш исправленный код содержит то же самое, что я написал, но объяснение было отличным. Спасибо за это, отметив это как ответ! И это решило мою проблему! - person Arefin; 14.05.2017