Гость TSerg 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Ну, так в варианте в посте №106 именно этот финт и использован. И тоже только для положительных целых. Разумеется, просто здесь без лямбд. А так, да - Ваш на первой полочке, хотя и с ограничением на диапазон. Вот без ограничений на знак: const m=-MaxInt-1; for i:=0 to Length(Arr)-1 do Arr[i]:=(Arr[i] xor m) shr 1 xor -(Arr[i] and 1 xor 1); Sort(Arr); for i:=0 to Length(Arr)-1 do Arr[i]:=(Arr[i] shl 1 xor m) xor -(Arr[i] shr 31) xor 1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Два раза бегать по массиву - это чемпион? :w00t: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость TSerg 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Два раза бегать по массиву - это чемпион? :w00t: Где сказано, что это "чемпион"? Да и два раза пробежаться - это линейная сложность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Два раза бегать или сортировать только натуральные числа - такая альтернатива? Два раза бегать - это два раза. Сегодня в обед испытал удовольствие, забыл кошелек, обнаружил уже у кассы. К черту такую линейную сложность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость TSerg 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Два раза бегать или сортировать только натуральные числа - такая альтернатива? Два раза бегать - это два раза. Сегодня в обед испытал удовольствие, забыл кошелек, обнаружил уже у кассы. К черту такую линейную сложность. Вам хочется поспорить ни о чем? Предоставляю это увлекательное занятие в форме Вашего же само-диалога. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Здесь не о чем спорить. Констатация факта в форме вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Разумеется, просто здесь без лямбд. Да тут не в лямбдах дело. Лямбда - это просто способ внедрить тело функции в выражение. Предыдущий пример без лямбды: def get_key(): return (1, -1*x) if x & 0x1 else (0, x) rnd.sort(key=get_key(), reverse=True) А так, да - Ваш на первой полочке, хотя и с ограничением на диапазон. Предыдущий пример (120-й пост и этот выше) без ограничений на диапазон. Два раза бегать по массиву - это чемпион? :w00t: А сколько проходов по массиву совершается внутри функции сортировки? Или вы полагаете, что внутри sort() оно за один проход сортирует? И вообще, каков вес (в смысле затрат) прохода по массиву - сиречь, работа с памятью, - на фоне операций сортировки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба А сколько проходов по массиву совершается внутри функции сортировки? Или вы полагаете, что внутри sort() оно за один проход сортирует? И вообще, каков вес (в смысле затрат) прохода по массиву - сиречь, работа с памятью, - на фоне операций сортировки? Логично, что того, кто пробежал дополнительный круг, вряд ли назовут чемпионом. Вот последнее ваше решение вполне может претендовать. Наряду с подобными на других языках - функция метода сравнения + сама библиотечная функция сортировки. Правда, ничего восхитительного в этом нет. Казуальное решение, оно и есть лучшее. Количество проходов от функции сортировки зависит. Будем считать, используется быстрая. Сколько надо, столько и есть. Проход по массиву с инвертированием членов, удовлетворяющих условию, думаю, соизмерим с проходом со сравнением пары и обменом местами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Логично, что того, кто пробежал дополнительный круг, вряд ли назовут чемпионом. Сперва надо определить, что есть "дополнительный круг". Если предварительная подготовка данных упрощает дальнейшую обработку так, что там в разы всё легче и быстрее, это как раз "сокращение дистанции", а не "дополнительный круг". Вы судите по виду исходного кода, но тут просто такие средства языка, который является низкоуровневым. На питоне это выглядит компактно и стройно, но по скорости может оказаться заметно хуже, хотя в данном случае вряд ли, т.к. функция сортировка написана на Си, а вычисление ключа делается не путём эн-кратного вызова функции, а путём прогона данных через функцию, что в целом даст результат, похожий на явный проход по циклу в низкоуровневом языке вроде Си. Вот последнее ваше решение вполне может претендовать. Наряду с подобными на других языках - функция метода сравнения + сама библиотечная функция сортировки. Так у TSerg по сути используется тот же метод. В моём примере выполняется подготовка ключей - массив элементов, каждый из которых связан с целевым сортируемым элементом, а затем собственно сортировка целевых элементов на основе значений ключей. У TSerg делается принципиально то же самое: сначала он готовит ключи, модифицируя элементы массива так, чтобы они могли выполнять роль ключей, затем сортировка по этим ключам. Ну, и финально вернуть значения элементов массива в исходному виду. Стандартные способы тут ничем не вырвутся вперёд. Проход по массиву с инвертированием членов, удовлетворяющих условию, думаю, соизмерим с проходом со сравнением пары и обменом местами. Проход со сравнением пары и перестановкой местами - это что, "пузыёк"? "Пузырёк" - один из самых медленных (хотя и один из самых простых и незатратных) способов сортировки. Там совершается почти столько проходов по массиву, сколько в массиве элементов. На этом фоне лишний проход по массиву ничего не портит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Нет, не "пузырек". Многие функции сортировки работают с парой элементов одинаково - сравнивают и, если нужно, переставляют местами. В том числе и быстрая сортировка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Нет, не "пузырек". Многие функции сортировки работают с парой элементов одинаково - сравнивают и, если нужно, переставляют местами. В том числе и быстрая сортировка. quicksort (который Хоара), насколько мне известно, сравнивает с опорным элементом, а переставляет пару, в которую опорный не входит. Но это не важно. Там всё равно суммарно получается эн проходов по массиву, где эн зависит логарифмически от количества элементов. Да, гораздо лучше "пузырька", особенно, когда элементов много. Один лишний проход снаружи сортировки погоды не портит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба quicksort (который Хоара), насколько мне известно, сравнивает с опорным элементом, а переставляет пару, в которую опорный не входит. Но это не важно. Там всё равно суммарно получается эн проходов по массиву, где эн зависит логарифмически от количества элементов. Да, гораздо лучше "пузырька", особенно, когда элементов много. В сообщении 105 алгоритм быстрой сортировки показан. Пусть не так работает с парой, это, действительно не существенно. Один лишний проход снаружи сортировки погоды не портит. Вообще-то, даже два: один до сортировки, один после. А можно без них, внутри функции сортировки все выполнить. Экономия очевидна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Вообще-то, даже два: один до сортировки, один после. А можно без них, внутри функции сортировки все выполнить. Экономия очевидна. Вообще-то, тут не просто сортировка, а сортировка с дополнительным условием (чёт-нечет), и это тоже надо как-то учитывать. Т.е. это выливается в некие дополнительные действия, и не факт, что они будут менее затратными, нежели один доп. проход по массиву. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
@Ark 3 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Вообще-то, тут не просто сортировка, а сортировка с дополнительным условием (чёт-нечет), и это тоже надо как-то учитывать. Т.е. это выливается в некие дополнительные действия, и не факт, что они будут менее затратными, нежели один доп. проход по массиву. Это все издержки ЯВУ. :) На любом асме эта проблема ничего не стоит. Просто считаем младший бит числа самым старшим и все. Можете, чисто для удобства, "крутануть" циклически весь регистр вправо, перед сравнением... Чет будет в начале, нечет - в конце отсортированного списка. Если нужен обратный порядок - инвертируем бит перед сравнением. P.S. По-моему, основной вопрос для любого языка - кому должно быть "удобно": программисту или процессору? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gruffly 0 6 апреля, 2017 Опубликовано 6 апреля, 2017 (изменено) · Жалоба Весело тут у Вас :) Кто-то считает, что линейный пробег по массиву сравним по быстродействию с любой сортировкой, даже самой быстрой? Таки я его разочарую. Берем алгоритм из поста #121. Делаем точные замеры ( на PC, Win7, Delphi 7, размерность времени в мкс) и что видим? Ой! - prepare и post - линейная пробежка по массиву; - sort - сортировка массива методом QuickSort, можно еще Radix-сортировку применить, но не принципиально что-то изменится. Изменено 6 апреля, 2017 пользователем Gruffly Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться