goto - с любимыми не расставайтесь, или break не тащит

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Ответить
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

SortArrayInteger([1, 5, 8, 7, 3, 4, 6], 7) ==> [1, 3, 5, 4, 6, 7, 8 ]
И чего же ты подправил? :)
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

Я боялся, что оно индекс решит привести к 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.

Код: Выделить всё

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;
Seenkao
энтузиаст
Сообщения: 569
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

iskander писал(а):Так похоже и раньше было не до них, пузырьковая сортировка целочисленного массива:
это называется разработка кода на глаз... :roll: даже не обратил внимания на мелочи, что цикл всего один и проверка идёт до нуля у меня.

Потому и тестирую свой код, что обязательно что-нибудь забуду. :)
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

скалогрыз писал(а):напугал ведь меня! всё норм работает

В текущем состоянии она даже не компилируется.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

iskander писал(а):В текущем состоянии она даже не компилируется.

ну вот эта ошибка больше похожа на правду :)
обновил!
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Теперь более-менее, но на пустом массиве с грохотом падает.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

iskander писал(а):Теперь более-менее, но на пустом массиве с грохотом падает.

не вопрос! позаимствовал твой If, то в стиле "любитель-goto" :)
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Ну вот и свершилось, не прошло и полгода. :)
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

zub писал(а):Сквозняк
>>Если бы мне потребовалась от него иная работа, то и написал бы по другому. Например так:
Уже как минимум 2 гото для выхода с сохранением переменной. не многим лучше установки флага о прерывании цикла

Быдлокодте в меру своей испорченности. умываю руки


Паскаль не должен отрывать 100% мыслительных ресурсов разработчика на обслуживание своих хитрожопых вывертов, для этого уже придуманы пожирающие мозг плюсы. Когда этих флагов в цикле накопится штук 20 и нужно будет сортировать порядок их работы, и в других примерно также, тут звиздец и подкрадётся.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

Кмк неплохо.
Seenkao
энтузиаст
Сообщения: 569
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

тьфу блин... не отвлекайте... а то я так своё и не доделаю и пойду проверять ваши наработки. :D
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

iskander
Хуль так медленно-то а((9.
Ну, я себе (не на вики, чтобы не пугать читателей) перенесу branchless-разделение, т. к. это оч крутая идея и она даёт основное ускорение. Остальное (из PDQSort) нинужно.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Честно говоря, я пробовал выкинуть из PDQSort всё кроме BlockQSort, в основном поведение не изменилось, но и размер кода тоже почти не изменился.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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.
Ответить