Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [Delphi] Сортировка одномерного массива |
Автор: Phenom 15.3.2008, 17:05 |
Общее описание Одномерный массив заполнить с использованием генератора случайных чисел. Алгоритм сортировки реализовать в отдельной процедуре (подпрограмме). Для вывода на экран элементов массива до и после сортировки использовать списки ListBox. Так же, найти наибольший и наименьший элементы массива, вывести на экран. Само задание Отсортировать массив вещественных чисел по возрастанию методом поиска экстремального. |
Автор: THandle 15.3.2008, 18:16 | ||
Вот код юнита главной формы:
На форме два ListBox и один Button. На всякий пожарный в аттаче сам проект. Написан в Delphi 2007. |
Автор: Phenom 15.3.2008, 20:22 |
При компиляции возникает ошибка Undeclared identifier:'MainFormOnTaskbar' У меня дельфи 7 |
Автор: THandle 15.3.2008, 20:44 |
Phenom, так... это вот действительно несовместимость семерки и 2007. Во втрой теме уже такое наблюдаю))) Есть два варианта в твоём случае: 1. Попробуй сам создать проект, разместить компоненты, потом скопируй код с форума, затем поприсваивай компонентам нужные методы(Button1Click, Form1Create) и запускай, если что то еще пиши сюда. 2. Я ставлю Делфи 7 и делаю тебе проект ![]() |
Автор: Phenom 15.3.2008, 20:54 | ||
Сделал вот это
Дак зачем там tmp? (строчка 56) |
Автор: THandle 15.3.2008, 21:07 | ||||
Phenom, это пузырьковая сортировка ![]() Ну давай попробую доказать что tmp там нужен ![]() Есть у нас некий массив. нам нужно поменять два его элемента местами. Вот так там реализовано:
а если убрать tmp?
Получается что мы сначала ставим на место с индексом iPos1 данные из элемента с индексом iPos2. Далее нам надо перебросить данные из элемента iPos1 в iPos2, но как? ведь в iPos1 находится теперь то же самое что и в iPos2. так что же получается? мы не поменяли местами, а просто присвоили двум элементам одно и то же значение. tmp хранит в себе промежточное значение из элемента ipos1, и после обмена первого на второе, все еще продолжает содержать предыдущие данные. После этого на позиию iPos2 встают старые данные из iPos1, содержащиеся теперь в tmp, так как в iPos1 уже лежат другие данные, а конкретно из элемнтп iPos2. Вот и происходит обмен. Надеюсь, что понятно выразился? |
Автор: Phenom 15.3.2008, 21:14 |
Кстати мне нужна сортировка по метуду Поиск наименьшего (наибольшего) Вот описание Массив условно делится на упорядоченную и неупорядоченную части. Первоначально весь массив неупорядочен. На каждом шаге алгоритма выбирается минимальный (максимальный) элемент в неупорядоченной части, он ставится на первое место в неупорядоченной части, после чего граница смещается на один элемент и цикл повторяется до тех пор, пока весь массив не станет упорядоченным. В модифицированном варианте метода выбранные элементы пересылаются в другой массив. При этом исходный массив не изменяется, но при очередном цикле выбора ищется не безусловно максимальный (минимальный) элемент, а элемент, больший (меньший) всех, но меньший (больший) элемента, выбиравшегося на предыдущем шаге. Если исходный массив разрешено изменять, то можно использовать ещё одну модификацию. После пересылки выбранного элемента в новый массив его место в старом массиве заполняется неким значением, которое заведомо никогда не будет выбираться в последствии. Пузырьки не пойдут Сори, что сразу не сказал, это имелось ввиду под методом поиска экстремального. |
Автор: THandle 15.3.2008, 21:48 |
Phenom, никогда не слышал о такой сортировке(может слышал, но под другим нажванием), но ничего сложного в ней не вижу. Сейчас попробую написать. Результат сегодня не гарантирую, так как поздно уже, времени много. |
Автор: Phenom 15.3.2008, 22:08 |
Хорошо, буду ждать ![]() |
Автор: VICTAR 15.3.2008, 22:15 |
Ребят, вы чего? Project -> View Source Убираем строчку Application.MainFormOnTaskbar := True; |
Автор: Phenom 17.3.2008, 17:54 |
Спасибо за прогу. Сверю с описанием. |
Автор: Phenom 18.3.2008, 21:17 |
THandle, Можешь вкратце алгоритм расписать с вырезками из проги? |
Автор: THandle 18.3.2008, 21:34 | ||||||||||||||||||||||
Phenom, алгоритм реализован в процедуре
В качестве единственного параметра в процедуру передается массив(var нужен что бы его можно было изменять).
В цикле от 1 до константы MAX(объявлена ранее) делаем следующее:
pmax это у нас индекс максимального числа в массиве на проходе i. каждый раз мы ему присваиваем минимально возможное значение, то етсть i.
тут мы находим индекс максимального элемента массива на данном проходе. В переменной pmax находится этот самый индекс. Главное заметь, что в цикле мы идем не с 1, а с i, то есть как бы разделяем массив на упорядоченную часть и не упорядоченную.
ставим на место i-ного элемента в упорядоченной части максимальный элемент, который находится в pmax. а элемент с индексом i переносим на место максимального элемента. Всё. Вот небольшой тебе пример как будет сортироваться следующий массив:
Это неупорядоченный массив из 5 элементов. 1 шаг сортировки:
2 шаг сортировки:
3 шаг сортировки:
4 шаг сортировки:
получаем на выходе следующий отсортированный массив:
|
Автор: Phenom 19.3.2008, 18:15 | ||
Можно ещё вот это пояснить. Особенно Assigned и последующее. |
Автор: THandle 19.3.2008, 19:18 | ||||||||||
Phenom, это уже, имхо, отход в сторону от темы. Поясню вкратце: Тебе ведь нужно все в listbox вносить? Точнее в его items, а эти items имеют как раз то тип TStrings, поэтому второй параметр этой процедуры как раз такого типа.(с первым я думаю всё понятно - это наш массив).
проверяет создано ли Strings. Если создано, то продолжаем работу, иначе выходим из процедуры. Я бы лично предпочел бы поднимать тут исключение, но я думаю тебе это не подойдет, так как не проходили скорее всего. Впринципе если ListBox ты кладешь в Design-time можно и не делать этой проверки, но всё лучше сделать. Тут мы очищаем Strings от всякого мусора(если он там конечно есть).
Тут мы все элементы нашего массива добавляем в Strings. А так кк вызываем мы эту процедуру так: В первый раз(до сортировки):
То весь массив будет добавлен в ListBox1.Items. Далее мы массив сортируем:
А теперь все элементы массива "распечатываем" в ListBox2.Items:
|