Здарова ребята!
Сидел июньским вечерком и решал задачки по программированию, для тренировки мозга, да и пальцы размять ;).
И вдруг, начались сложности с задачей. Задачка вроде простая, дан конкретный код быстрой сортировки:
Код:
void quick_sort(int * a, int left, int right, int & count) {
int key = a[ (left + right) / 2 ];
int i = left;
int j = right;
do {
while (++count, a[i] < key) ++i;
while (++count, key < a[j]) --j;
if (i <= j) {
swap(a[i], a[j]);
++i, --j;
}
} while (i <= j);
if (left < j) quick_sort(a, left, j, count);
if (i < right) quick_sort(a, i, right, count);
}
Надо найти перестановку элементов от
до
, такую,
что на ней значение переменной count после работы сортировки будет максимальной.
Ясно что для быстрой сортировки, худший случай, когда она в качестве опорного элемента выбирает максимальный в подмассиве, который сортирует, в такой случае глубина рекурсии будет N. Но, я считаю, что одной теоретической информации о сортировке недостаточно чтобы решить данную задачу. Поэтому, я написал вот такой вот код:
Код:
#include <iostream>
#include <algorithm>
using namespace std;
void copy(int * a, int * b, int n) {
for (int i = 0; i < n; ++i)
b[i] = a[i];
}
int main() {
const int a_size = 16;
int a[a_size], b[a_size], c[a_size];
for (int i = 0; i < a_size; ++i)
a[i] = i+1;
for (int size = 2; size <= 11; ++size) {
sort(a, a+size);
int count_max = 0, perm_num = 1, max_perm_num;
do {
int count = 0;
copy(a, b, size);
quick_sort(b, 0, size-1, count);
if (count_max < count) {
max_perm_num = perm_num;
count_max = count;
copy(a, c, size);
}
++perm_num;
} while (next_permutation(a, a+size));
cout << size << " : " << count_max << endl;
cout << max_perm_num << endl;
for (int i = 0; i < size; ++i)
cout << c[i] << ' ';
cout << endl << endl;
}
{
int n;
cin >> n;
}
return 0;
}
В данной коде перебираются все перестановки, и выводится та, на которой сортировка сделала больше всего сравнений (значение count было максимальным)
Вывод данной программы:
Код:
size: 2
count: 3
perestanovka: 1
1 2
size: 3
count: 6
perestanovka: 2
1 3 2
size: 4
count: 12
perestanovka: 5
1 4 2 3
size: 5
count: 19
perestanovka: 18
1 4 5 3 2
size: 6
count: 27
perestanovka: 69
1 4 6 3 2 5
size: 7
count: 36
perestanovka: 332
1 4 6 7 2 5 3
size: 8
count: 46
perestanovka: 1899
1 4 6 8 2 5 3 7
size: 9
count: 57
perestanovka: 12832
1 4 6 8 9 5 3 7 2
size: 10
count: 69
perestanovka: 99297
1 4 6 8 10 5 3 7 2 9
size: 11
count: 82
perestanovka: 871118
1 4 6 8 10 11 3 7 2 9 5
Я предполагаю, что этих данных достаточно чтобы найти закономерность и научиться генерировать
худшие случаи для массивов больших размеров. Для данной задачи требуется сгенерировать массив
размера 70000.
Помогите мне найти закономерность.