И чего же ты подправил?
goto - с любимыми не расставайтесь, или break не тащит
Модератор: Модераторы
SortArrayInteger([1, 5, 8, 7, 3, 4, 6], 7) ==> [1, 3, 5, 4, 6, 7, 8 ]
И чего же ты подправил?
И чего же ты подправил?
Я боялся, что оно индекс решит привести к Word, то есть сделает ему «and (1 shl 16 - 1)», но оно не делает, окей.
Лень регистрироваться :( Но ладно, сейчас сделаю свою клёвую.
Алсо, для индексов массивов лучше использовать не integer, а SizeInt: на 64-битной платформе массивы могут быть длиннее 2 млрд. элементов, а sizeof(Integer) = 4. RTL для индексов и длин использует как раз SizeInt.
Добавлено спустя 1 час 29 минут 21 секунду:
Сделал, проверьте: https://wiki.freepascal.org/Array_sort#Advanced_version, а то устанавливать стабильный компилятор мне тоже лень))0.
Добавлено спустя 7 минут 22 секунды:
Кстати, ещё такая тема: ты в своём быстром исправлении сделал 2 SetLength, когда можно один на двойную длину, эдакий memory region.
скалогрыз писал(а):Смело правьте!
Лень регистрироваться :( Но ладно, сейчас сделаю свою клёвую.
Алсо, для индексов массивов лучше использовать не integer, а SizeInt: на 64-битной платформе массивы могут быть длиннее 2 млрд. элементов, а sizeof(Integer) = 4. RTL для индексов и длин использует как раз SizeInt.
Добавлено спустя 1 час 29 минут 21 секунду:
Сделал, проверьте: https://wiki.freepascal.org/Array_sort#Advanced_version, а то устанавливать стабильный компилятор мне тоже лень))0.
Добавлено спустя 7 минут 22 секунды:
Кстати, ещё такая тема: ты в своём быстром исправлении сделал 2 SetLength, когда можно один на двойную длину, эдакий memory region.
Код: Выделить всё
procedure AnySort(var Arr; Count: Integer; Stride: Integer; CompareFunc: TCompareFunc);
var
bufs: array of byte;
begin
SetLength(bufs, 2 * Stride);
AnyQuickSort(Arr, 0, Count-1, Stride, compareFunc, bufs[0], bufs[Stride]);
end;это называется разработка кода на глаз...iskander писал(а):Так похоже и раньше было не до них, пузырьковая сортировка целочисленного массива:
Потому и тестирую свой код, что обязательно что-нибудь забуду.
iskander писал(а):SortArrayInteger([1, 5, 8, 7, 3, 4, 6], 7) ==> [1, 3, 5, 4, 6, 7, 8 ]
И чего же ты подправил?
напугал ведь меня! всё норм работает
Код: Выделить всё
1 5 8 7 3 4 6
1 3 4 5 6 7 8у тебя точно свежая копипаста?
runewalsh писал(а):Кстати, ещё такая тема: ты в своём быстром исправлении сделал 2 SetLength, когда можно один на двойную длину, эдакий memory region.
хорошая, годная оптимизация! беру!
скалогрыз писал(а):напугал ведь меня! всё норм работает
В текущем состоянии она даже не компилируется.
iskander писал(а):В текущем состоянии она даже не компилируется.
ну вот эта ошибка больше похожа на правду
обновил!
Теперь более-менее, но на пустом массиве с грохотом падает.
iskander писал(а):Теперь более-менее, но на пустом массиве с грохотом падает.
не вопрос! позаимствовал твой If, то в стиле "любитель-goto"
Ну вот и свершилось, не прошло и полгода. 
zub писал(а):Сквозняк
>>Если бы мне потребовалась от него иная работа, то и написал бы по другому. Например так:
Уже как минимум 2 гото для выхода с сохранением переменной. не многим лучше установки флага о прерывании цикла
Быдлокодте в меру своей испорченности. умываю руки
Паскаль не должен отрывать 100% мыслительных ресурсов разработчика на обслуживание своих хитрожопых вывертов, для этого уже придуманы пожирающие мозг плюсы. Когда этих флагов в цикле накопится штук 20 и нужно будет сортировать порядок их работы, и в других примерно также, тут звиздец и подкрадётся.
runewalsh, на моей старенькой машине(20000000 integers):
Кмк неплохо.
Код: Выделить всё
--LGenerics-----------------
TimSort: 2668 ms
MergeSort: 2043 ms
QuickSort: 1513 ms
IntroSort: 1544 ms
DualPivotQuickSort: 1513 ms
PDQSort: 795 ms
Sort(ordinal): 266 ms
------------------------------
AnySort2: 1794 ms
Кмк неплохо.
тьфу блин... не отвлекайте... а то я так своё и не доделаю и пойду проверять ваши наработки. 
iskander
Хуль так медленно-то а((9.
Ну, я себе (не на вики, чтобы не пугать читателей) перенесу branchless-разделение, т. к. это оч крутая идея и она даёт основное ускорение. Остальное (из PDQSort) нинужно.
Хуль так медленно-то а((9.
Ну, я себе (не на вики, чтобы не пугать читателей) перенесу branchless-разделение, т. к. это оч крутая идея и она даёт основное ускорение. Остальное (из PDQSort) нинужно.
Честно говоря, я пробовал выкинуть из PDQSort всё кроме BlockQSort, в основном поведение не изменилось, но и размер кода тоже почти не изменился.
runewalsh писал(а):Сделал, проверьте: https://wiki.freepascal.org/Array_sort#Advanced_version
переименовал в Generic version.
теперь вся страница посвящена сортировке массива, а не сортировке массива без дженериков
заинтересовался этим вопросом:
runewalsh писал(а):Алсо, для индексов массивов лучше использовать не integer, а SizeInt: на 64-битной платформе массивы могут быть длиннее 2 млрд. элементов, а sizeof(Integer) = 4. RTL для индексов и длин использует как раз SizeInt
вот от сюда
sizeint corresponds to the size of the "offset" part of pointers, while ptrint to the size of an entire pointer. On most platforms these are the same because they use a linear address space, but e.g. on 16 bit MSDOS with a memory model that supports far data, sizeint is 16 bit while ptrint is 32 bit (16 bit segment + 16 bit offset).
в официальной документации всё скуднее
SizeInt is used to describe sizes of structures in FPC using a signed integer. The actual type of this type depends on the architecture: its size reflects the maximum addressable memory on the current architecture, thus it is 64-bit on 64-bit platforms, 32-bit on 32-bit platforms, and 16 bit on 16 bit platforms.
