Вычислить минимальное/максимальное/среднее число перемещений в алгоритме selection sort

Реализация алгоритма выглядит следующим образом:

for (int i = 0; i < n; ++i) {
    int min = i;
    for (int j = i + 1; j < n; ++j) {
        if (a[j] < a[min]) { //compare
            min = j; //move
        }
    }
    int tmp = a[i]; //move
    a[i] = a[min]; //move
    a[min] = tmp; //move
}

Получилось вычислить минимальное число мувов: 3*(n-1)
Насколько будут верны мои вычисления для максимального числа?(рисунок) введите сюда описание изображения

Сначала суммируются все мувы внешнего цикла for от i = 0 до i = n-1. Далее к ним прибавляется сумма мувов из внутреннего цикла.

Среднее значение перемещений не очень понимаю как вычислять, прошу с этим помочь тоже.
Еще хотелось бы уточнить, что именно считается за перемещения? Как понял, любые действия, связанные с перемещением элементов массива или изменение переменных, влияющих на на порядок или количество перемещений элементов в массиве.


Ответы (1 шт):

Автор решения: MBo

Ну вот, например, в wiki считаются обмены (ваших 3n move), которые происходят всегда, а обновление минимального индекса не учитывается.

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

Со средним количеством обновления индекса минимума, кажется, всё непросто. Обновление происходит при обнаружении инверсии, а инверсий в среднем n*(n-1)/4 (в среднем по всем n! перестановок) , однако каждый обмен начального элемента серии нарушает имеющиеся инверсии. Тем не менее, n*(n-1)/4 кажется разумной оценкой.

А вам вообще надо точное количество или асимптотику посчитать (типа O(n^2)) ?

→ Ссылка