|
Заблокирован
|
||||||
Тонкости быстрой сортировки16.11.2011, 05:50. Показов 2853. Ответов 18
Метки нет (Все метки)
Излазил кучу мест в сети. Нашел массу этих алгоритмов, но на поверку практически каждый не совсем работающий.
Представляется, что в этой сортировке есть какая-то тонкость, но какая вот? Вот часть моего кода, осуществляющая патишинирование. Не могу понять правильно она рабботает или нет. По отдельности вроде правильно (ну в смысле, когда оформляется в виде отдельной функции: вот так:
Самое забавное, это то,что практически все алгоритмы, которые предлагаются в качестве алгорита быстрой сортировки, легко опровергаются (то есть простенькие тестовые массивы не сортируются) путем замены индекса элемента массива, служащего раздеелителем исходного массива на два подассива. Вообще складывается такое впечатление, что никто и никогда так и не написал этой быстрой сортировки, и существует она только в теории, а все остальное выдаетсяя за нее, но таковой на самом деле не является.
0
|
||||||
| 16.11.2011, 05:50 | |
|
Ответы с готовыми решениями:
18
Пример быстрой сортировки массива строк и сортировки методом выбора Алгорим быстрой сортировки Не алгоритм быстрой сортировки |
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 16.11.2011, 06:26 | |
|
Эта функция будет работать неправильно в случае если head или tail перескочат элемент с partition. В лучшем случае она выполнит лишнюю работу, в худшем не выполнит основную задачу.
0
|
|
|
Заблокирован
|
|
| 16.11.2011, 07:00 [ТС] | |
|
Дело в том, что в сети предлагются только такие алгоритмы патишенизации массива.
0
|
|
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 16.11.2011, 07:15 | |
|
thick_int, А ты умеешь только готовыми алгоритмами пользоваться? тебе нужно что бы и все проверки за тебя сделали. Эту функцию нужно доработать и она будет делать что надо.
Например не давай элементам перепрыгнуть partition, как дошел, так останавливай его.
0
|
|
|
Заблокирован
|
|
| 16.11.2011, 07:40 [ТС] | |
|
Нет, я пытаюсь написать этот алгоритм сам, но встречая трудности, смотрю то, что сделали люди и предложили в качестве образца. Ну так вот первое с чем я столкнулся, это то что эти образцы, описываеммые даже в книжках, ломаются очень легко.
Ну и второе совершенно непонятны Ваши утверждения насчет перескока. Ведь перескок означает необходимость произзвести обмен. Главное чтобы они обе одновременно череез один и тот же элемент не скакнули. Ну а лишняя работа вообще непонятна, где она там может быть.
0
|
|
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 16.11.2011, 07:55 | |
|
thick_int, Очень просто. Так как движения хвоста и головы идет не равномерно может получиться так что один из них подойдет к partition. Что произойдет дальше?
1. Если это хвост то partition поменяется местами с головой. И твои указатели сдвинутся, голова вперед, хвост назад. И тут как раз ты увидишь что и хвост и голова оказались с одной стороны partition. Они начнут сортировать то что между ними. Если там все элементы больше partition то это будет пустая работа, так как результат уже получен, однако вернется из функции не номер элемента с partition, а вообще непонятно какой номер. Если там есть элементы меньше partition, то они как были справа от partition так справа и останутся, следовательно функция свою задачу не выполнит. 2. Если голова, то ситуация похожая. Ты вручную попробуй нарисовать и сразу все понятно будет.
0
|
|
|
|
|||||||
| 16.11.2011, 07:58 | |||||||
0
|
|||||||
|
Заблокирован
|
||||||||||||||||||||||||||
| 16.11.2011, 08:56 [ТС] | ||||||||||||||||||||||||||
|
Да с ходу. Я тоже пытался им воспользоваться, но в этом алгоритме сразу же легко усматривается выход за границы массива.
Кроме того, замените выражение в 7 строчке на a[0] и сразу же получите крэш. Логика рекурсивных вызовов не такая тут примитивная, она должна проверять, каковы яявляются массива после патишинации. И КСТАТИ, ЕСЛИ АЛГОРИТМ СОРТИРОВКИ НАПИСАН ПРАВИЛЬНО, ТО ВЫ ЛЕГКО МОЖЕТЕ В ЭТОМ УБЕДИТЬСЯ, ЗАМЕНЯЯ ВЫБРАННЫЙ ВАМИ PARTITION НА ЛЮБОЙ ДОПУСТИМЫЙ ЭЛЕММЕНТ МАССИВА. ТО ЕСТЬ, ЕСЛИ АЛГОРИТМ НАПИИСАН КОРРЕКТНО, ТО В ВАШЕМ СЛУЧАЕ ЗАМЕНА, КОТОРУЮ Я УКАЗАЛ, НИКАК НЕ ОТРАЖАЛАСЬ ЮЫ НА РАБОТОСПОСОБНОСТИ АЛГОРИТМА. ТАК ВОТ, ЧТОБЫ УБЕДИТЬСЯЯ В ЛАЖОВОСТИ ВАШЕГО АЛГОРИТМА ДОСТАТОЧНО СДЕЛАТЬ ЭТУ ЗЗАМЕНУ И ВЫЗВАТЬ ЕГО ВОТ С ТАКИМ НАБОРОМ ДАННЫХ int a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; Попробуйте и посмотрите на run-time error. У мен лично сразу же выскочила эта ошибка от Вашего алгоритма. Добавлено через 24 минуты А наконец допетрил, как ммне кажется и у меня получилось вот что. Во всякомм случае не крешится как у Вас Комментарии все достаточно поясняют
Проверил работоспособность все отлично, во вском случае вот с такими даннымми креша нет и сортируется все отлично: double a[ARRSIE] = {1000.2, 100.4, 8.2, 9.4, 100.4, 8.2, 2.1, 1.4, 5.5, -5.9};
0
|
||||||||||||||||||||||||||
|
Заблокирован
|
|
| 16.11.2011, 10:01 [ТС] | |
|
Нет, конечно некорректно. Это просто означает, что Вы его слабенькое тестировали.
Немного повозившись, Вы самми сможете найти контрприер (состоящий из массива из трех элементов), на котором Ваш алгоритм ломается и без вской модификации. Но, в целом, иногда алгоритм быстрой сортировки, вот в такой убогой форме, в которой Вы его представили, может давать правильные результаты, но это отнюдь не означает, что то, что предложено Вами, абсолютно правильно. Я уже сказал, что в Вашем алгоритме явно видно возможное нарушение, свзанное с выходомм за допустимые границы массива. (А в моей программе этого нет).
0
|
|
|
|
||
| 16.11.2011, 11:25 | ||
|
0
|
||
|
Заблокирован
|
||||||
| 16.11.2011, 12:38 [ТС] | ||||||
|
Да, Вы знаете, я его тоже проанализировал вот так:
0
|
||||||
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 16.11.2011, 12:56 | |
|
Проверь на вот этом тесте при partition равном 5
int a[10] = {10, 9, 8, 2, 5, 4, 3, 2, 1, 1};
0
|
|
|
Заблокирован
|
|
| 16.11.2011, 13:21 [ТС] | |
|
А это разве хорошо, что реализаци такая хрупенькая?
Вообще этот алгоритм лучше всего прописывать в термиинах указателей, а не индексов. Тогда, по крайней мере, становтся очевидными вопросы, такие как, а двигался ли хвост, где находится голова. Ну и к тому же мо реализаци позволяет дальнейшее улучшение за счет оптимального выбора партиции. Ваша наверно тоже, но в Вашем случае нужно быть, крайне осторожным. Добавлено через 22 минуты Да, но у Вас тоже не все так плохо. Кстати, проверка показывает, что Ваша программа может работать с массивом, по крайней мере в 100000 элементов, а моя крешится уже при 3200. Есть куда копать.
0
|
|
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 16.11.2011, 13:29 | |
|
thick_int, Вы спорите о размерности, когда обе программы на небольших тестах лажают. У обоих прог принцип одинаков, отличаются только детали, которые доводятся до ума чисто при отладке...
0
|
|
|
Заблокирован
|
||
| 16.11.2011, 13:42 [ТС] | ||
Добавлено через 3 минуты Мне, например, пока в голову лезут только такие способы улучшения: 1) Использовать быструю сортировку только для массивов, размеры которых не менее заданного (также подумать о верхней границе) 2) Если первый элемент массива меньше последнего, то обменть их мместами, и только затем приступать к сортировке, в противном случае, подумать, куда их поставить. Кстати тест, который Вы предложили, спокойно проходится и моей программой и программмой от Thinker
0
|
||
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 16.11.2011, 13:55 | |
|
thick_int, Ты проверил на тесте, который я написал? Честно говоря ради интереса проверил на одной из ваших прог, думал вдруг ошибаюсь, оказалось действительно сортирует некорректно, почему я писал выше.
Раньше писал, сейчас нет особо времени писать прогу, так как мне пока без надобности. Добавлено через 3 минуты thick_int, Проходит то он проходит, но программа неверно сортирует! Добавлено через 3 минуты Сейчас еще раз проверю, может неправильно написал тебе тест
0
|
|
|
Заблокирован
|
|
| 16.11.2011, 14:00 [ТС] | |
|
Нет я еще раз проверил и свою программу и программу от Thinker.
Все работает корректно и сортирует корректно.
0
|
|
| 16.11.2011, 14:00 | |
|
Помогаю со студенческими работами здесь
19
Алгоритм быстрой сортировки
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|