-
Во-первых, можно использовать быструю сортировку, но переключаться на пирамидальную в случае, когда максимальный размер неосортированного сокращается мало.
Во-вторых, есть стратегия выбора элемента, с которым должно производится сравнение: P := (L + R) shr 1; Тут большой простор для творчества. Бери рандомный элемент из диапазона [L, R] и уже тебе будет грубоко наплевать на то, какое хитрое наполнение было в массиве.
-
> Sha © (16.12.18 20:57) [36]
Александр, приветствую!
С завалами разобрался, пришло время использовать быструю сортировку от Sha))
Попытался разобраться, но не вышло. Напрямую у меня не компилируется с ошибкой на строке 134 - cannot access property (у меня Delphi2007). Решил поправить код на прямое использование TStrings.Strings вместо List. Естественно, т.к. используется удвоенный индекс, то валится с ошибкой - list index out of bounds.
Если не сложно, то прокомментируй, пожалуйста, смысл строк 134 и 135. Я в принципе не могу понять, как параметр List соотносится с реальными строками в TStringList.TList.
Спасибо.
-
0 целых чз. десятых... не замерял, но быстро, моментально просто...
with TStringList.Create() do
try
Sorted:= true;
LoadFromFile('data.txt');
SaveToFile('Sort.txt');
finally
Free();
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end; в твоем случае похоже длинный и уже отсортированный список, для квиксорта нечего "делить", самый неудачный вариант для квиксорта.
-
вернее, нужно добавить, а то у тебя там часть дублирующихся значений, которые в "выходном" файле пропадают with TStringList.Create() do
try
Sorted:= true;
Duplicates:= dupAccept;
LoadFromFile('data.txt');
SaveToFile('Sort.txt');
finally
Free();
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
-
> Тимохов Дима © (14.01.19 09:42) [41] > Если не сложно, то прокомментируй, пожалуйста, смысл строк 134 и 135.
Смысл в том, чтобы получить адрес первого элемента динамического массива.
|