PDA

Показать полную графическую версию : Быстрая сортировка


noname00.pas
08-01-2002, 12:56
Идея метода заключается в следующем: выбираем в массиве произвольный элемент и ставим его "на своё место". Все элементы меньшие выбранного должны оказаться слева, а больше справа. И потом просто вызываем рекурсивную процедурку, которая аналогичным образом отсортирует левую и правую части массива.

Пример кода:

procedure swap(var a, b : integer);
var
*c : integer;
begin
*c := a;
*a := b;
*b := c;
end; *{Это просто процедурка, которая меняет местами значения A и B}

procedure sort(l, r : integer);
var
*Y, j, x : integer;
begin
*Y := l;
*j := r; {с помощью указателей Y и J мы будем "двигаться по массиву"}
*x := a[(l + r) div 2]; {выбрали произвольный элемент. Например из серединки}
*repeat
* *while (a[Y] < x) do inc(Y); {Двигаем левый указатель до близжайшего элемента, большего X}
* *while (a[j] > x) do dec(j); {Двигаем правый указатель до близжайшего элемента, меньшего X}
* *if Y <= j then begin
* * *swap(a[Y], a[j]);
* * *inc(Y);
* * *dec(j);
* *end; {поменяли элементы местами, сдвинули указатели}
*until Y > j;
*if Y < r then sort(Y, r);
*if j > l then sort(l, j);
end;

As is (я не несу ответственности за последствия получения вами данного кода)

Праверьте ещё раз, правильно ли работает... Если что - стучите :)

[Гневные ругательства в адрес BigMac-а]
Кстати говоря... Паскалевское обращение к элементу массива вида A[W], где вместо "W" стоит "I" твой форум распознал как открытие тэга... Сделай примочку, которая в тэге CODE игнорирует все другие тэги...
[/Гневные ругательства в адрес BigMac-а]

(Отредактировал(а) noname00.pas - 10:06 8-01-2002)

BigMac
08-01-2002, 13:54
noname00.pas
Понял..... он распознал его как косой шрифт.......гляну..... :)

BluesBrother
08-01-2002, 14:37
noname00.pas
Вау! Круто! А на сколько быстрее она работает. А то зачем ее писать если я и пузырьком могу отсортить :)

noname00.pas
08-01-2002, 14:45
BluesBrother
В худшем случае (при специально подобранных данных) она работает за O(N*N) операций. Но вероятность выпадения именно таких данных на достаточно больших массивах ничтожна мала, поэтому в общем случае кол-во операций можно оценивать как O(N*log(N)). В среднем этот алгоритм работает быстрее, чем HeapSort, Шелл и прочие алгоритмы сложности O(N*log(N))

(Отредактировал(а) noname00.pas - 11:46 8-01-2002)

Apis.NET
09-01-2002, 07:25
noname00.pas :up:

ivank
08-02-2002, 09:43
Кстати говоря... Паскалевское обращение к элементу массива вида A[W], где вместо "W" стоит "I" твой форум распознал как открытие тэга... Сделай примочку, которая в тэге CODE игнорирует все другие тэги...
Лень. Если нужно поставить именно [[, то пиши квадратную скобку дважды [[[[. []как ни странно, но это написано не жирным шрифтом[]

noname00.pas
09-02-2002, 13:04
ivank
А если програмка уже написана, а я её через буффер обмена сюда вставляю? :Р

ivank
09-02-2002, 17:55
noname00.pas
существует такая штука как "Поиск и замена". Открываешь блокнот, и проводишь в нём эту архисложную операцию со своей прогой :)

noname00.pas
10-02-2002, 23:23
ivank
Проще один раз исправить скрипт, чем каждый раз открывать блокнот. :)

VuDZ
03-03-2002, 22:03
std::sort :>
Кнута почитайте-с, - не знаснёте - много нового узнаете

ivank
04-03-2002, 09:39
std::sort это и есть быстрая сортировка (аналог сишного qsort, только на столь нелюбимых кем-то шаблонах :)), а он рассказывал про то, как это работает.

Кнута почитайте-с, - не знаснёте - много нового узнаете
Если бы не MIX, то была бы прекрасная книга -- а в асм несуществующей машины разбираться трудно. Хотя можно построить её мулятор...

VuDZ
04-03-2002, 14:39
а на фига разбираться? у тея есть алгоритм. описание того, как это должно работать и всё. Да и асм там не сложной, у iP2 И старше гораздо сложнее

ivank
04-03-2002, 17:32
Обычно мне хватает моего КЛР (Кормен&Лейзерсон&Ривест).




© OSzone.net 2001-2012