Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Плохой массив для QuickSort


Автор: lucyk 28.10.2008, 18:54
Подскажите пожалуйста какой массив будет сортироваться быстрой сортировкой максимальное вермя? (В качестве опорного элемента выбирается средний элемент)

Автор: Akina 28.10.2008, 19:11
Цитата(lucyk @  28.10.2008,  19:54 Найти цитируемый пост)
какой массив будет сортироваться быстрой сортировкой максимальное вермя? 

В котором на каждом шаге будет выполняться обмен.

Автор: lucyk 28.10.2008, 19:29
Покажите пожалуйста пример

Автор: ksili 29.10.2008, 15:44
Насколько я помню, худший случай для быстрой сортировки - это уже отсортированный массив.

Автор: Larrr 31.10.2008, 17:18
"Быстрота" быстрой сортировки заключается в разделении массива на примерно 2 равные подмасива. Если бы нам было гарантировано, что наш опорный элемент (взятый за константное время) всегда разобьет массив на 2 равные части, то алгоритм бы работал всегда O(n*logn) ( T(n) = T(n/2) + T(n/2) + n, если посчитать , что по идее должно получиться n*logn ).

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


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

Добавлено через 47 секунд
Цитата(ksili @ 29.10.2008,  15:44)
Насколько я помню, худший случай для быстрой сортировки - это уже отсортированный массив.

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

Автор: maxdiver 1.12.2008, 00:05
Вроде когда-то давно мне попадалась именно такая олимпиадная задача.
Вот её условие:
Цитата
"Интеллект против QSort"

Для сортировки последовательности чисел широко используется быстрая сортировка - QSort. Ниже приведена программа, которая сортирует массив a, используя данный алгоритм. 

Хотя QSort является самой быстрой сортировкой в среднем, существуют тесты, на которых она работает очень долго. 

Будем оценивать время работы алгоритма количеством сравнений, сделанных с элементами массива (т.е. суммарным количеством сравнений в первой и втором while). Требуется написать программу, генерирующую тест, на котором быстрая сортировка сделает наибольшее число таких сравнений.

Код
procedure QSort(left, right : integer);
var m, i, j, t : integer;
begin
  m := a[(left+right) div 2];
  i := left; j := right;
  repeat
    while a[i] < m do inc(i); {первый while}
    while a[j] > m do dec(j); {второй while}
    if i <= j then
    begin
      t := a[i]; a[i] := a[j]; a[j] := t;
      inc(i); dec(j);
    end;
  until i > j;
  if j > left then QSort(left, j);
  if i < right then QSort(i, right);
end;



Не знаю как решали эту задачу другие, а я написал перебор, выдающий все такие "плохие" перестановки, и долго вкуривал их. Через пару часов выявил одну из закономерностей, и закодил её:
Код
int n;
cin >> n;
vector<int> a (n);
if (n == 1)
    a[0] = 1;
else if (n == 2)
    (a[0] = 1), (a[1] = 2);
else if (n == 3)
    (a[0] = 2), (a[1] = 1), (a[2] = 3);
else
{
    a[1] = 1; a[2] = 3;
    for (int step=4; step<=n; step++)
        if ((step & 1) == 0)
            a[step-1] = a[(step>>1)-1];
        else
        {
            a[step-1] = a[step>>1];
            a[step>>1] = step;
        }
    for (int i=0; i<(n>>1); i++)
        a[i] = i+i+2;
}
for (int i=0; i<n; i++)
    printf ("%d ", a[i]);

Автор: jessica 3.9.2011, 09:43
maxdiver, 
Программа почему-то не работает: например для N=5 выводит 4(должно быть 10). Может есть другие идеи??

Автор: volatile 3.9.2011, 15:50
Цитата(lucyk @  28.10.2008,  18:54 Найти цитируемый пост)
Подскажите пожалуйста какой массив будет сортироваться быстрой сортировкой максимальное вермя?

Для этого нужен как минимум исходник QuickSort для конкретной целевой платформы/либы.
Потому как внутреннее устройство QuickSort зависит от реализации.

Автор: esperanto 5.9.2011, 21:26
У вероятностной  реализации быстрой сортировки нет плохих массивов в принцепе, именно ее и используют

Автор: volatile 6.9.2011, 00:51
Цитата(esperanto @  5.9.2011,  21:26 Найти цитируемый пост)
У вероятностной  реализации быстрой сортировки нет плохих массивов в принцепе

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

Автор: maxdiver 7.9.2011, 13:09
jessica, может быть, у Вас немного другой алгоритм быстрой сортировки? Там же всё очень зависит от деталей.

esperanto, ну если включить "зануда-mode" - то сама по себе применяемая псевдо-рандомность не поможет, поскольку, зная алгоритм псевдо-рандома и его начальные параметры, можно сделать anti-тест и против такой сортировки. Так что если автор программы не позаботился о хитром rand-seed, сгенерить тест против программы будет вполне реально.

Кстати, вот легко читаемая статья по этому поводу: http://www.cs.dartmouth.edu/~doug/mdmspe.pdf.

Автор: esperanto 22.9.2011, 17:31
Цитата(volatile @ 6.9.2011,  00:51)
Цитата(esperanto @  5.9.2011,  21:26 Найти цитируемый пост)
У вероятностной  реализации быстрой сортировки нет плохих массивов в принцепе

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

Я такого не говорил. И гарантию не дам.))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)