Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Простая программа на С. Помогите найти ошибку, надеюсь, для программистов она очевидна. Очень хотелось бы именно ошибку

l l Мудрец (15716), закрыт 5 лет назад
найти (для эффективности учебы).
Задача-Нужно отсортировать массив в следующем порядке 12,10,8,6,4,2,1,3,5,7,9,11
а у меня получается 11,9,7,5,3,1,2,4,6,8,19,12 Сама никак не могу найти ошибку.
Сортирую следующим образом - создаю цикл по i. i служит счетчиком, чтоб пройти весь массив, и исходя из четности/нечетности i назначается целевой индекс, в который будет записан максимальный элемент для данного шага по i (есть два варианта - down, up - их взаимосвязь с i описана в комментах, строки 39-40). дальше в массиве от down до up ищем максимальный элемент, перебрав весь массив - записываем этот максимальный элемент в целевой индех.
код здесь
https://pastebin.com/23gEiBWA
огромное спасибо!!!
Лучший ответ
Валерий Шестаков Просветленный (25523) 5 лет назад
Что-то я основной идеи не понял.
Почему поведение опирается на четность позиции в массиве?
А так - обычная сортировка, только условие несколько сложнее, четные отдельно, нечетные отдельно, ну и смешанная пара
l lМудрец (15716) 5 лет назад
Спасибо!
i - не позиция в массиве, а просто счетчик, для 0,2,4,6,8,10 итерации по i идет одно поведение, для 1,3,5,7,9,11 другое. Возможно, стоило переменную назвать не i а counter.
Я учусь сама, сама изобретаю велосипеды и набиваю собственные шишки, сама придумываю все алгоритмы. Обычно достаточно быстро получаю достаточно элегантные решения.
В данном случае (кстати, с проблемой, описаной в вопросе справилась), решения элегантного все равно нет у меня, никак до него не додумаюсь пока что.
Все равно плясать приходится от i, в зависимости от нее определено с какой частью массива на данной итерации вообще работаем, и в какую ячейку пишем максимум (для данной итерации).
Валерий Шестаков Просветленный (25523) Примерно понял. На первом же шаге ломается на второй перестановке, та, которая через ?:. Как-то там условия пересмотреть нужно. Насчет велосипедов - изобретать их дело, конечно, полезное, но когда существующий велопарк чем-то не устраивает. Насчет элегантного решения: я бы тут обычную сортировку применил (хоть того же пузырька), но модифицировал бы условие перестановки примерно так: 1. Для пары четный-нечетный нечетный всегда считается "больше" четного 2. Для пары четных условие для убывания ("больший" считать "меньшим", инверсное сравнение). 3. Для пары нечетных условие для возрастания (обычное сравнение). А уж потом вокруг этого стал бы велосипеды с костылями втыкать на предмет оптимизации под заранее известный набор неотсортированных значений.
Остальные ответы
Miku Hatsune Мудрец (11188) 5 лет назад
Ошибка в том, что ты проходишь некоторые элементы дважды
Тебе не нужно итерировать через весь массив, а только до тех пор, пока
while(down < up)
kaiu Высший разум (115622) 5 лет назад
Это не ответ, так пожелание к форматированию https://pastebin.com/ENbs7DYA
И да, я там погадил русскими комментами, чтобы враг не разобрался.
inline void swap_el(int *a, int ind1, int ind2)
Сделал inline так как производительность так тратить не рационально
https://software.intel.com/ru-ru/blogs/2012/05/16/inline
l lМудрец (15716) 5 лет назад
Спасибо!
за inline спасибо отдельное, не изучала еще такого, начинаю активно использовать.
я все стараюсь загнать в функции, и у меня много циклов в циклах которые вызывают функции - очень пригодится. надо сразу привыкать к правильному стилю, спасибо!
Похожие вопросы