Выбор Сортировка Объяснение - PullRequest
0 голосов
/ 17 апреля 2020

Я работал над рекурсивной функцией в C, которая принимает массив int и его размер и выполняет сортировку выбора, где массив теперь должен быть упорядочен от наименьшего к наибольшему:

void selection_sort(int integers[], size_t size)
{
    if (size == 0) {
        return;
    }

    int largest = 0;
    int largest_index = 0;
    int temp;

    for (int i = 0; i < size; ++i) {
        if (integers[i] > integers[largest_index]) {
            largest_index = i;
        }
    }
    temp = integers[largest_index];
    integers[largest_index] = integers[size - 1];
    integers[size - 1] = temp;

    selection_sort(integers, size - 1);
}

Поэтому, если целые числа содержат 17, 8, 14, 25 и 11, после вызова selection_sort теперь он будет содержать 8, 11, 14, 17 и 25. Код работает так, как должен, однако я пытался отследить логи c на бумаге, и я не думаю, что я думаю об этом правильно, потому что я не получаю числа, которые я должен. Мне было интересно, если кто-нибудь мог бы подробно объяснить логику функции c функции. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 17 апреля 2020

Давайте разберем ваш код, чтобы понять его рабочий процесс.

ваша функция принимает два аргумента: один - массив, а другой - размер массива

selection_sort(int integers[], size_t size)

Вторая часть, если размер массив равен нулю, затем возвращается

if (size == 0) {
        return;
    }

Третья часть, определить переменные

int largest = 0; //this variable is not used
int largest_index = 0; //this is index for largest array value
int temp; //temporary variable for swapping 

Четвертая часть найти индекс наибольшего значения в массиве

for (int i = 0; i < size; ++i) { //Iterate array from 0 to size
        if (integers[i] > integers[largest_index]) { /*check if current index value is greater than largest value index */
            largest_index = i; /* if value is greater than current index value add index in largest_index variable */
        }

В первой итерации для массив [17, 8, 14, 25, 11] large_index будет равен 3 (25).

Пятая часть, своп наибольшее значение и последний элемент массива

[17, 8, 14 , 25, 11] станет [17, 8, 14, 11, 25]

 temp = integers[largest_index]; //take 25 in temp
    integers[largest_index] = integers[size - 1]; 
    integers[size - 1] = temp; //swap 11 with 25

Последняя часть, рекурсивный вызов функции с массивом уменьшенного размера на 1 элемент

Пример в массив первой итерации будет [17, 8, 14, 11], а во второй итерации [11, 8, 14] он будет продолжать уменьшать размер массива, пока не вернется (размер станет равным нулю)

selection_sort(integers, size - 1);
...