Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Сортировка Shell
Посл.ответ Сообщение

Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 22 января 2007 08:22
· Личное сообщение · #1

Всем привет...

Вот код:
Procedure Sort_Shell(var a: array of Word);
var
bis, i, j, k: LongInt;
h: Word;
begin
bis := High(a);
k := bis shr 1;// div 2
while k > 0 do
begin
for i := 0 to bis - k do
begin
j := i;
while (j >= 0) and (a[j] > a[j + k]) do
begin
h := a[j];
a[j] := a[j + k];
a[j + k] := h;
if j > k then
Dec(j, k)
else
j := 0;
end; // {end while]
end; // { end for}
k := k shr 1; // div 2
end; // {end while}

end;


И есть пару вопросов...
1. Как узнать процент выполнения сортировки Shell
2. Является ли это самым быстрым методом сортировки... Если нет, то какой самый быстрый.

P.S. Надо отсортировать массив строк...




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 22 января 2007 08:28
· Личное сообщение · #2

www.hardline.ru/1/11/1351/

www.google.com/ - вперёд

-----
[nice coder and reverser]





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 22 января 2007 09:32
· Личное сообщение · #3

NeoTall пишет:
1. Как узнать процент выполнения сортировки Shell

Прога для замера времени выполнения кода:
downloadfinder.intel.com/scripts-df-external/Product_Filter.aspx?ProductID=232&lang=eng
Требуется небольшая регистрация, но зато бесплатная =)




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 22 января 2007 09:42 · Поправил: s0larian
· Личное сообщение · #4

NeoTall, чувак, а ты не можешь забить строки в TList/TStringArray (не помню дельфи, много лет уже прошло) и вызвать sort() ? Получишь quick sort - и всё.

Ну а про производительность - сделай цикл вызывающий это чуда кодинга 100 000 раз и вызыви GetPerformanceCounter() до и после.



Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 22 января 2007 09:52
· Личное сообщение · #5

Всем кто ответил сенкс... Тока вы меня видимо не поняли
Вариантов-то сортировки до самого копчика есть...на Дельфах... Т.ч. второй вопрос - это так для проформы... А по поводу первого, не так поняли... Я имел ввиду именно ПРОЦЕНТ!!! Не время, а процент, в смысле для отображения, скажем на ПрогрессБаре. Если есть 20000 строк, я их сортирую положим ShellSort или QuickSort. Как мне отобразить процент выполнения сортировки???




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 22 января 2007 10:02
· Личное сообщение · #6

NeoTall пишет:
Как мне отобразить процент выполнения сортировки???

Сначала попробуй в основном цикле поставить увеличение счетчика. Запусти, посмотри как у тебя он увеличивается по времени - квадатично, показательно, а потом измени на аналогичную функцию.
Скорее всего квадратично, но проверь.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 22 января 2007 10:30
· Личное сообщение · #7

NeoTall, ааа вот в чём дело... Тогда как пишет HoBleen - свой собственный цикл. В нём реализуешь, скажем, quick sort у которого computational complexity O(n*log(n)). Потом смотришь сколько у тебя элементов и считаешь приблизительное количество перестановок.

Потом просто - скажем у тебя 100 шагов в progress bar, на каждый шаг получается Х перестановок. Вот и делаешь StepIt() каждые Х перестановок.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 23 января 2007 00:03
· Личное сообщение · #8

NeoTall пишет:
1. Как узнать процент выполнения сортировки Shell

Правильный ответ - никак. Меня всегда забавляли прогрессбары Микрософта, которые отражали процент неизвестно чего и росли скачками. Для того чтобы точный процент узнать пришлось бы сортировку два раза делать - один раз для калибовки прогрессбара и второй раз "красиво"...
Если нужны "шашечки" - тогда действительно привязатся к счетчику и "морочить юзерам голову".


 eXeL@B —› Программирование —› Сортировка Shell
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати