Опять массивы
И снова здравствуйте! В этот раз я пришел не за кодом(в кои-то веки),
а за советом. Итак, собственно, само задание : Дан массив N из набора случайных чисел. Отсортировать массив в таком порядке - Пример: 0 1 2 3 4 5 6 7 8 9 10 - 10 8 6 4 2 0 1 3 5 7 9 //массив после сортировки// Ну, то есть большое влево - маленькое вправо и т.д. Я уверен, решение у меня под носом, однако пока не додумался. Мне нужна только подсказка, хотя бы в каком направлении думать, не все же на шее висеть да код вымаливать. Заранее спасибо всем тем, кто не пройдет мимо и поможет. Авось из меня что-нибудь и выйдет:ctivo: |
И все же непонятно - почему в массиве после сортировки ( в Вашем примере ) идет дублирование чисел?
Случайные - это понятно. Но как 8-ку какую-то перекинуть влево или вправо? Странное задание. Так-то - все просто. Отсортировать по убывающей. Идти с нулевого индекса и раскидывать в два новых массива через раз, затем слить оба массива в новый искомый или старый. P.S. Есть особенности по четности/нечетности размерности массива. |
Цитата:
А вообще - забавная такая задачка. По-всякому решать можно. Ну вот, например, с использованием множеств (Alexey123, Вы уж простите великодушно, что программа написана на ЯП Free Pascal, т.е. на языке времён, как выяснилось, нашествия Батыя): Код:
Type |
Ну или так, в соответствии с вышеизложенной мной идеей.
Из недостатков - расход памяти на доп. массивы, но зато высокоуровенный стиль и большая понятность для начинающих: Код:
var Код:
len=30 [0,1,1,1,2,2,2,3,3,3,3,4,5,5,5,6,6,6,7,7,7,7,7,7,7,8,8,8,9,9] |
Еще один вариант, где исключена сортировка начального большого массива, но введены сортировки двух усеченных массивов. Это к вопросу о методике повышения скорости выполнения, т.к. один большой массив сортируется дольше, чем два массива половинной размерности. Чисто методическое решение.
Код:
var |
Ну и мои пять копеек:
Код:
uses Crt; |
И еще один вариант, где case заменен на if else, поскольку это тоже повышает (в общем случае) быстродействие.
Также исключены комментарии, поскольку высокоуровенный код и так является самодокументируемым. Код:
var ЯП - PascalABC.Net. Практически все это доступно на FreePascal и Delphi. |
Спасибо! Спасибо всем! Такие добрые люди, душа радуется! Все понятно, все по полочкам, отблагодарил бы всех, да вот только исчерпал лимит "благодарностей" пользователю, такие дела. Я вам очень, очень признателен! Даже не знаю как поблагодарить :feel:
|
Так и мы рады, что "все понятно". :)
|
Вложений: 1
Немного "зацепила" эта задачка, потому продолжу. Не столько для ТС, сколько в порядке междусобойчика.
Начать с того, что ТС абсолютно невразумительно сформулировал задание. Цитата:
1. Как поняли Viewer (жаль, не знаю имени) и Евгений: В левой части нового массива должны расположиться все нечетные (по значению) элементы в порядке убывания. В правой - все четные в порядке возрастания. 2. Как понял Vladimir_S (то бишь я): Максимальный элемент ставится в крайнюю левую позицию, следующий по значению - в крайнюю правую, следующий - во вторую слева, следующий - во вторую справа и т.д. Решение именно этой задачи я и предложил. (Хотел бы я знать, что нашему ТС "понятно", если решались разные задачи, и кто прав - мне лично совсем непонятно). Так вот, решение, предложенное мною (в моей интерпретации задания), далеко от оптимального (множества, лишний массив и т.п.), а потому пришло мне в голову другое - простое и изящное, вообще не требующее ни вспомогательных массивов, ни множеств. Да и четность длины массива отрабатывается автоматически. Вот так: Код:
Type |
Часовой пояс GMT +4, время: 17:11. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.