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

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

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

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

Сообщение iskander » 02.11.2020 11:53:42

SortArrayInteger([1, 5, 8, 7, 3, 4, 6], 7) ==> [1, 3, 5, 4, 6, 7, 8 ]
И чего же ты подправил? :)
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение runewalsh » 02.11.2020 12:07:13

Я боялся, что оно индекс решит привести к 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;
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение Seenkao » 02.11.2020 15:58:05

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

Потому и тестирую свой код, что обязательно что-нибудь забуду. :)
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

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

Сообщение скалогрыз » 02.11.2020 16:30:14

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.

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

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

Сообщение iskander » 02.11.2020 16:35:13

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

В текущем состоянии она даже не компилируется.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение скалогрыз » 02.11.2020 16:45:31

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

ну вот эта ошибка больше похожа на правду :)
обновил!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение iskander » 02.11.2020 17:02:21

Теперь более-менее, но на пустом массиве с грохотом падает.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение скалогрыз » 02.11.2020 17:04:34

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

не вопрос! позаимствовал твой If, то в стиле "любитель-goto" :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение iskander » 02.11.2020 17:08:14

Ну вот и свершилось, не прошло и полгода. :)
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Сквозняк » 02.11.2020 17:16:46

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

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


Паскаль не должен отрывать 100% мыслительных ресурсов разработчика на обслуживание своих хитрожопых вывертов, для этого уже придуманы пожирающие мозг плюсы. Когда этих флагов в цикле накопится штук 20 и нужно будет сортировать порядок их работы, и в других примерно также, тут звиздец и подкрадётся.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

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

Сообщение iskander » 02.11.2020 18:17:54

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

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

Сообщение Seenkao » 02.11.2020 18:23:40

тьфу блин... не отвлекайте... а то я так своё и не доделаю и пойду проверять ваши наработки. :D
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

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

Сообщение runewalsh » 02.11.2020 18:39:14

iskander
Хуль так медленно-то а((9.
Ну, я себе (не на вики, чтобы не пугать читателей) перенесу branchless-разделение, т. к. это оч крутая идея и она даёт основное ускорение. Остальное (из PDQSort) нинужно.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение iskander » 02.11.2020 18:48:20

Честно говоря, я пробовал выкинуть из PDQSort всё кроме BlockQSort, в основном поведение не изменилось, но и размер кода тоже почти не изменился.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение скалогрыз » 02.11.2020 19:56:55

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.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru