Нужна помощь в понимании сегмента кода

public int[] selectionSort(int array[]) {

    for(int i = array.length - 1; i >= 0; i--) { 
        int highestIndex = i;

        for(int j = i; j >= 0; j--) {
            if(array[j] > array[highestIndex])
                highestIndex = j;
        }
        int temp = array[i];
        array[i] = array[highestIndex];
        array[highestIndex] = temp;
    }
    return array;
}

Я понимаю концепцию сортировки выбором, но код меня смущает. В частности, может ли кто-нибудь объяснить, что происходит в последних трех операторах внешнего цикла for, начинающихся с «int temp = array[i];»


person Guy Fieri    schedule 07.06.2016    source источник
comment
stackoverflow .com/questions/13766209/   -  person Sotirios Delimanolis    schedule 08.06.2016
comment
Вы меняете местами array[i] и array[highestIndex]. Для этого вы делаете копию array[i], чтобы вы могли получить доступ к значению после того, как оно было перезаписано array[i] = array[highestIndex];.   -  person RaminS    schedule 08.06.2016


Ответы (1)


Это знаменитая процедура обмена. В таких языках, как Java, когда вы хотите поменять местами значения двух переменных с именами, скажем, a и b, вы должны прибегнуть к такой процедуре, где вы используете третью переменную для хранения значения в пути:

int a = 2; 
int b = 6;
int tmp = a; // now tmp has a value that is _copy_ of a i.e. 2
a = b;  // since we saved a in tmp, we can _mutate_ it, now a has b's value
b = tmp; // swap! here, b = a won't work because a contains b's current value.
// now a has value 6 and b has value 2, exactly what we wanted.

В некоторых других языках для этой цели доступна конструкция типа a, b = b, a, которая, на мой взгляд, более интуитивно понятна.

При сортировке выбором, после того как внутренний цикл находит индекс элемента с наибольшим значением, необходимо поменять местами его с элементом, удерживаемым индексом внешнего цикла, и вот чего это достигает в этом контексте.

person Kedar Mhaswade    schedule 07.06.2016
comment
Спасибо, это было то, что я искал. Я знал, что два значения меняются местами, но не понимал, как это влияет на остальную часть кода. - person Guy Fieri; 08.06.2016