|
0 / 0 / 0
Регистрация: 18.10.2015
Сообщений: 7
|
||||||||||||||||||||||||||
Задача по быстрой сортировке18.10.2015, 23:31. Показов 6288. Ответов 9
Метки нет (Все метки)
Здравствуйте, товарищи-программисты. Недавно столкнулся с задачей:
Сортировка подсчетом (Время: 2 сек. Память: 16 Мб Сложность: 29%) На планете «Аурон» атмосфера практически отсутствует, поэтому она известна своими перепадами температур в различных точках. Известно, что эти перепады колеблются от -100 до 100 градусов. Нашим специалистам удалось выяснить значения температур в N точках этой планеты. К сожалению, эти значения вычислены с большими погрешностями, поэтому их решили округлить до целых чисел. Хотелось бы наглядно видеть участки с повышенной и пониженной температурой. Вам требуется помочь. Вы должны упорядочить температуры участков по неубыванию. Входные данные В первой строке входного файла INPUT.TXT задано натуральное число N - количество участков (N ≤ 1000000). Во второй строке через пробел записаны целые значения температур этих участков, не превосходящие 100 по абсолютной величине. Выходные данные В единственную строку выходного файла OUTPUT.TXT нужно вывести разделенные пробелом значения температур всех известных участков, которые должны следовать друг за другом в порядке неубывания. Сразу понял, что задача решается обычной быстрой сортировкой. Мое решение этой задачи на Pascal:
Код на С++:
Поискав в интернете, я нашёл более оптимизированный вариант сортировки: Код на С++:
Ошибка в коде на С++ объяснялась тем, что я занял массив не на миллион элементов, а на сто тысяч, я пытался занять массив на миллион (видимо плоха идея), но Microsoft Visual Studio 2008 выдал мне ошибку (как я и ожидал) - Stack Overflow. Теперь мой вопрос: реально ли написать быструю сортировку на С++/С#, которая сортировала бы массив на миллион элементов, учитывая, что на С++ нельзя заводить массивы на миллион элементов, а на C# все это дельце занимает слишком много памяти? Есть ли какой-нибудь более "хитрый" алгоритм сортировки именно под эту задачу? P.S. Прочитал решение этой задачи на acmu - там говорилось про сортировку подсчетом и приводился псевдокод решения задачи. Идею предложенного там решения я понял, погуглил, написал такую сортировку, но вылетела опять на седьмом тесте. А псевдокод, приведенный там - неработающий бред. Короче говоря - я в тупике уже два дня. Помогите пожалуйста!
0
|
||||||||||||||||||||||||||
| 18.10.2015, 23:31 | |
|
Ответы с готовыми решениями:
9
Ошибка в быстрой сортировке
Визуализатор по быстрой сортировке Хоара на С++ |
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
|
| 19.10.2015, 10:16 | |
|
Сортировка подсчётом.
Заводим массив на 201 элемент. Для каждого числа из входных данных увеличиваем на 1 элемент массива A[t+100]. На основе этого массива формируем выход. (Для каждого элемента массива выводим число i-100 A[i] раз). Добавлено через 20 минут Посмотрел код C# и не нашёл отличий между первым и вторым ("более продвинутым") вариантами. Мне не нравится, как Вы считываете массив. Предлагаю считывать по одному числу (как Вы делаете в Паскале) и обойтись без ReadToEnd
1
|
|
|
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
|
||
| 19.10.2015, 11:59 | ||
|
1
|
||
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
||
| 19.10.2015, 12:11 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 18.10.2015
Сообщений: 7
|
|||||||||||
| 19.10.2015, 12:28 [ТС] | |||||||||||
|
Здравствуйте, спасибо, что написали.
Прочитал ваш вариант сортировки, опять погуглил, порылся в своих кодах, соединил вместе и написал следующее: Код на C#:
И я решил поэкспериментировать с типами, в принципе, диапазон - от - 100 до + 100, т.е. обычного sbyte должно было хватить. Код на C#:
В ближайшее время начну писать эту задачу на С++ - памяти он меньше жрет, может прокатит. P.S. По поводу чтения из файлов в C#, в отличие от Pascal - чтение реализуется только через строки(насколько я знаю), которые уже нужно переводить в целые числа. Поэтому и пользовался ReadToEnd. Добавлено через 5 минут По поводу этого цикла: "repeat...until i>j", я его естественно заменил на "do..while(i>j)", но из-за этого программа застревала и бесконечно работала (даже не сортировала), затем поискав в интернете, нашёл быструю сортировку на С++ - единственное отличие - не было этого цикла "do...while(i>j)", я его удалил - всё пошло на лад. В любом случае, сейчас пороюсь в кодах и на свежую голову попробую вернуть этот цикл - может у меня там ошибка была в другом месте.
0
|
|||||||||||
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
|
| 19.10.2015, 12:57 | |
Сообщение было отмечено ОчереднойДжедай как решение
Решение
1
|
|
|
0 / 0 / 0
Регистрация: 18.10.2015
Сообщений: 7
|
|
| 19.10.2015, 13:14 [ТС] | |
|
Глупейшая ошибка! Я бы ее никогда не нашел, спасибо!)
0
|
|
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
|||||||
| 19.10.2015, 13:17 | |||||||
Сообщение было отмечено ОчереднойДжедай как решение
РешениеЗатем выделяется память под массив строк и выделяется память для каждой строки. Затем каждая строка обрабатывается парсером. Это очень много лишней работы (в 5-10 раз больше, чем сама сортировка). И это время можно сократить на порядок, если не выделять ненужную память. Запись можно сократить примерно в 1.5 раза (не выделять память под строку-число), поэтому нет особого смысла усложнять код.
1
|
|||||||
|
0 / 0 / 0
Регистрация: 18.10.2015
Сообщений: 7
|
|||||||||||
| 19.10.2015, 15:12 [ТС] | |||||||||||
|
Мои решения этой задачи (все прошли на 100 баллов):
Код С#:
Про "особое" чтение массива из файла в С# - я бы никогда не догадался, спасибо вам ещё раз за помощь в "освоении" и в написании сортировки подсчётом, ну и за нахождение ошибки в быстрой сортировке. Ну правда, очень помогли
0
|
|||||||||||
|
8 / 5 / 3
Регистрация: 11.03.2015
Сообщений: 94
|
||
| 22.10.2015, 03:47 | ||
|
0
|
||
| 22.10.2015, 03:47 | |
|
Помогаю со студенческими работами здесь
10
Количество произведенных сравнений в Быстрой Сортировке Количество сравнений и перестановок в быстрой сортировке Подсчитать кол-во перестановок в быстрой сортировке
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|