Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбор опорного элемента в быстрой сортировке 
V
    Опции темы
xreal
Дата 11.6.2010, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Подскажите пожалуйста каким образом лучше всего выбирать опорный элемент в быстрой сортировке. То есть так, чтобы это был примерно средний по значению в массиве. Для того, чтобы массив делился на примерно две равные половины. Спасибо.
PM MAIL   Вверх
esperanto
Дата 11.6.2010, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 31.5.2003

Репутация: 2
Всего: 4



Выбирите случайно 20 элементов и из них возьмите средний.



--------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET
PM MAIL   Вверх
xreal
Дата 11.6.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Не совсем понял вас. Но ведь я таким образом тоже могу случайно выбрать самый маленький или самый большой, что приведёт к вырожденному массиву и повысит сложность сортировки до O(n^2). 
PM MAIL   Вверх
xreal
Дата 12.6.2010, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Спасибо.

Это сообщение отредактировал(а) xreal - 12.6.2010, 04:05
PM MAIL   Вверх
maxim1000
Дата 12.6.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



припоминаю, что когда-то кто-то упоминал про алгоритм "медиана медиан"

там массив делился на части, у каждой части выбиралась медиана, потом уже из них выбиралась медиана тем же алгоритмом, получалось O(n)

подробностей алгоритма не помню, но можно попробовать поискать


--------------------
qqq
PM WWW   Вверх
esperanto
Дата 12.6.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 31.5.2003

Репутация: 2
Всего: 4



Цитата(xreal @ 11.6.2010,  22:10)
Не совсем понял вас. Но ведь я таким образом тоже могу случайно выбрать самый маленький или самый большой, что приведёт к вырожденному массиву и повысит сложность сортировки до O(n^2).

Самый маленький вы никогда не выберите вообще.


--------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET
PM MAIL   Вверх
xreal
Дата 12.6.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



2maxim1000, спасибо, интересный вариант, скорее всего реализую именно его.

2esperanto, почему вы решили, что невозможно выбрать самый маленький?
PM MAIL   Вверх
v1m
Дата 12.6.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


v1mka



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.6.2010

Репутация: нет
Всего: 1



Если тебе именно QuickSort нужен то сложность O(n log n) 
Вот код. 
Код

  Procedure QSort(l,r : longint);
  var
    i,j,x,y : longint;
  begin
    i:=l; j:=r; x:=p[(l+r) shr 1];
    repeat
      while x<p[i] do inc(i);
      while x>p[j] do dec(j);
      if j<i then break;
      y:=p[i]; p[i]:=p[j]; p[j]:=y;
      inc(i); dec(j);
    until j<I;
    if l<j then QSort(l,j);
    if i<r then QSort(i,r);
  end;

PM MAIL   Вверх
xreal
Дата 12.6.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



2 v1m, на сколько я помню паскаль, у вас опорный элемент x выбирается просто как средний элемент массива. Это не лучший вариант. Потому что элемент всегда выбирается детерминированно. В книге кормена предлагается выбирать каждый раз случайный элемент из сортируемого подмассива. Тогда вероятность попадания на наибольший или наименьший элементы самая маленькая. Спасибо вам за код, но не подходит)

А если вы подумали, что мне просто нужен алгоритм, код быстрой сортировки, то это не нужно) я его прекрасно знаю) Дело в том, что в некоторых случаях сложность быстрой сортировки не O(n log n), а может быть O(n^2). Вот таких случаев надо постараться избежать, не смотря на то, что они могут быть и очень редкими. 

Поэтому остановлюсь на одном из вариантов:

1. Выбор каждый раз случайного элемента.

2. Или предложенный выше алгоритм медианы медиан.

Это сообщение отредактировал(а) xreal - 12.6.2010, 17:51
PM MAIL   Вверх
esperanto
Дата 12.6.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 31.5.2003

Репутация: 2
Всего: 4



Вам (1) вариант один не подходит, вы же сами про это сказали.


Дело в том, что в некоторых случаях сложность быстрой сортировки не O(n log n), а может быть O(n^2). Вот таких случаев надо постараться избежать.



Мой вариант намного лучше вашего варианта (1).


Вариант 2 гарантирует с вероятностью 1 О(п лог п)  но  там большая константа получается. Так как на каждом шаге за линейное время ищут медиану.

Быстрая случайная сортировка выдаст квадратичную сложность с вероятностью 
 2 встепени (-п)   
с точностью до константы.

Для данных длиной больше 30 это очень маленькое число.


Это сообщение отредактировал(а) esperanto - 12.6.2010, 19:39
--------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET
PM MAIL   Вверх
xreal
Дата 12.6.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Цитата

Выбирите случайно 20 элементов и из них возьмите средний.


Возможно я чего-то не понимаю. Вы предлагаете выбрать 20 случайных элементов, а потом непонятно чем отсортировать их и взять среднее по значению. Или из этих 20 элементов взять средний по индексу?
Цитата

1  - 2 встепени (-п)   


Вообще не понял, что вы имеете ввиду в этой записи.
PM MAIL   Вверх
esperanto
Дата 12.6.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 31.5.2003

Репутация: 2
Всего: 4



Цитата(xreal @ 12.6.2010,  19:18)
Цитата

Выбирите случайно 20 элементов и из них возьмите средний.


Возможно я чего-то не понимаю. Вы предлагаете выбрать 20 случайных элементов, а потом непонятно чем отсортировать их и взять среднее по значению. Или из этих 20 элементов взять средний по индексу?
Цитата

1  - 2 встепени (-п)   


Вообще не понял, что вы имеете ввиду в этой записи.

1) отсортировать 20 элементов стоит О(1) времени.


2) там написано два в степени минус эн.
--------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET
PM MAIL   Вверх
xreal
Дата 12.6.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Всем спасибо за советы)
PM MAIL   Вверх
maxim1000
Дата 12.6.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(xreal @  12.6.2010,  15:12 Найти цитируемый пост)
2maxim1000, спасибо, интересный вариант, скорее всего реализую именно его.

только перед этим лучше бы поискать его полное описание
а то я сильно сомневаюсь, что у меня - полное


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.2007 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.