Число сравнений в сортировке вставкой зависит от упорядоченности элементов, что выгодно отличает её от сортировки выбором, это понятно. Но в самом худшем случае (массив 5 4 3 2 1 нужно отсортировать в 1 2 3 4 5), когда переставлять нужно каждый элемент - этот бонус не работает, ведь так ? Я хочу посчитать это численно - и получается какой - то бред.
Число копирований (без учета копирований индексов) у выбора: N * 3
Число копирований у перестановки : N + N + N * (N - 1) / 2
То есть копирований будет даже больше, а работает всё равно быстрее.
Ну что я считаю не так ?
void select () {
for (int outer = nElems - 1; outer > 0; --outer) {
int index_max = outer;
for (int inner = outer - 1; inner >= 0; --inner) {
if (a [ inner ] > a [ index_max ]) { // n_comp = N * (N-1) / 2
index_max = inner;
}
}
int temp = a [ outer ]; // N
a [ outer ] = a [ index_max ]; // N
a [ index_max ] = temp; // N
}
}
void insert () {
for (int outer = 1; outer < nElems; ++outer) {
int temp = a [ outer ];// N
int inner = outer;
for (; inner > 0 && a [ inner - 1 ] > temp; --inner) {// n_comp = N * (N-1) * 2
a [ inner ] = a [ inner - 1 ]; // n_copy = N * (N-1) / 2
}
a [ inner ] = temp; // N
}
}