Скачиваний:
18
Добавлен:
01.05.2014
Размер:
26.56 Кб
Скачать

Turbo Pascal | Глава 6 a:link {TEXT-DECORATION: none} a:visited {TEXT-DECORATION: none} a:active {TEXT-DECORATION: none} a:hover {COLOR: #007EFF;} A.menu:link { Color:#FFFFFF; } A.menu:visited { Color:#EEEEEE; } A.menu:hover { Color:#CCDDFF; } .glow { FILTER: DropShadow(Color=#000000, OffX=1, OffY=1, Positive=1)FILTER: Glow(Strength=1, Color=#454545); } .logot { color:#FFFFFF; }  

В в е д е н и е  /  О г л а в л е н и е  /  О т   а в т о р а

М е н ю

1. Интегрированная среда разработки программ Turbo Pascal 7.0 2. Лексические основы языка Pascal 3. Программирование алгоритмов линейной структуры 4. Алгоритмы и программы ветвящейся структуры 5. Алгоритмы и программы циклической структуры 6. Регулярные типы данных. Массивы 6.1 Понятие регулярного типа

6.2 Работа с массивами

6.2.1 Инициализация элементов массива

6.2.2 Нахождение суммы и произведения массива 6.3 Алгоритмы сортировки массивов

6.3.1 Постановка задачи сортировки и методы её решения

6.3.2 Алгоритмы и программы сортировки

6.3.2.1 Алгоритм сортировки обменами ("пузырьковая" сортировка)

6.3.2.2 Алгоритм сортировки вставками

6.3.2.3 Алгоритм сортировки выбором элемента

6.3.2.4 Алгоритм быстрой сортировки (метод Хоора)

6.3.2.5 Алгоритм пирамиды (метод Уильямса-Флойда) 7. Подпрограммы в Turbo Pascal

Алгоритмы сортировки массивов

      Алгоритмы сортировки информации образуют основу для огромного большинства прикладных программ. Сортировка информации - это одна из стандартных функций, возникающих в процессе решения задач.

      Сортировка данных это процесс изменения порядка расположения элементов в некоторых упорядоченных структурах данных таким образом, чтобы обеспечить возрастание или убывание числового значения элемента данных или определенного числового параметра, связанного с каждым элементом данных (ключа), при переходе от предыдущего элемента к последующему. То есть для любой пары чисел определены отношения "больше" или "меньше".

      Для переменных символьного типа понятия "возрастание" и "убывание" относятся к значениям машинного кода, используемого для представления символов в памяти компьютера. Так как все буквенные символы располагаются в таблице кодов по алфавиту, то сортировка слов текста всегда приводит к их упорядочению в алфавитной последовательности.

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

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

Постановка задачи сортировки и методы её решения

      Задачу сортировки данных можно сформулировать для информационной совокупности самой различной природы - для числовой информации, для слов и символов текста. Для этого, требуется определить понятие порядка для элементов массива, определить понятия "больше" и "меньше" для каждой пары элементов. Отсортировать последовательность чисел можно точно таким же способом, как и последовательность строк текста. Необходимо только определить какой из элементов пары "больше" другого.

      Более важным для выбора алгоритма является местоположение данных - в оперативной памяти компьютера или на внешнем устройстве.

      Здесь играет роль различие в основных критериях качества - для данных в оперативной памяти основными положительными свойствами метода являются быстродействие и потребности в дополнительной памяти. Для дисковых файлов очень важным показателем является количество обращений к устройству для выполнения операций ввода-вывода - оно должно быть минимальным.

      Различают два вида сортировки данных:

      - сортировка данных, расположенных в оперативной памяти компьютера (внутренняя сортировка);

      - сортировка данных, расположенных на внешних запоминающих устройствах (внешняя сортировка).

      Сформулируем постановку задачи сортировки данных для внутренней сортировки одномерного числового массива по возрастанию.

      Имеется одномерный массив чисел, состоящий из n элементов: X[n]. Переставить элементы массива так, чтобы их значения располагались в порядке возрастания. Другими словами, для любой пары элементов X[i] и X[i+1] выполняется неравенство вида:

      X[i] <= X[i+1].

      В этой задаче однозначно определяется структура данных для внутренней сортировки (одномерный массив) и порядок упорядочения элементов. Ключом для определения порядка элементов является само числовое значение элемента массива. Результатом решения задачи должна быть программа сортировки массива одним или несколькими методами.

      При разработке программы можно воспользоваться различными алгоритмами. Наиболее известными являются следующие:

      - метод сортировки обменами ("пузырьковая" сортировка);

      - метод сортировки вставками;

      - метод сортировки выбором элемента;

      - метод разделения (алгоритм "быстрой" сортировки метод Хоора);

      - метод "пирамиды" (метод Уильямса-Флойда).

      Главным показателем качества алгоритма внутренней сортировки является скорость сортировки.

      Алгоритмы "пирамиды" и "быстрой" сортировки обеспечивают высокую скорость сортировки и находят широкое практическое применение. Недостатком "быстрой" сортировки является возможность резкого увеличения трудоемкости при "неблагоприятном" исходном порядке элементов в массиве. С другой стороны, метод "пирамиды" в целом отстает по скорости от "быстрой" сортировки.

      Выбор в пользу того или иного алгоритма может быть сделан при условии тщательного статистического анализа реальной задачи и это является достаточно важной проблемой в программировании.

Алгоритмы и программы сортировки

Алгоритм сортировки обменами ("пузырьковая" сортировка)

      Метод "пузырька" один из самых простых методов внутренней сортировки. Суть алгоритма состоит в последовательном просмотре массива от конца к началу или от начала к концу и сравнении каждой пары элементов между собой. При этом "неправильное" расположение элементов устраняется путем их перестановки. Процесс просмотра и сравнения элементов повторяется до просмотра всего массива. При сортировке по возрастанию "легкие" элементы с меньшим значением как бы "всплывают" к началу массива подобно тому, как это делают пузырьки воздуха в стакане с водой - отсюда и происходит популярное название алгоритма.

      "Пузырьковая" сортировка имеет очень плохие временные характеристики. Она имеет только учебно-исторический интерес и не может быть рекомендована для практического использования.

      Одна из возможных версий процедуры, реализующей алгоритм "пузырька", представлена на языке программирования Pascal. Массив для сортировки X[n] и его размер n считаются глобальными переменными. Тип элементов массива - целый, (для системы Borland Pascal - Integer). Сортировка осуществляется по возрастанию.

Procedure Puzirek;

Var i, j: Integer;

y:Integer;

Begin

For i := 2 to n do

For j := n downto i do

If X[j-1] > X[j] then begin y:=X[j-1];

X[j-1]:=X[j];

X[j]:=y

end;

End; Алгоритм сортировки вставками

      Метод сортировки вставками заключается в переборе всех элементов массива от первого до последнего и вставке каждого очередного элемента на место среди предшествующих ему элементов, упорядоченных ранее таким же способом. Поскольку процесс начинается с самого первого элемента, то последовательность упорядоченных элементов постепенно растет до тех пор, пока самый последний элемент не встанет на "свое" место. Освобождение места для вставки элемента осуществляется путем соответствующего сдвига группы элементов.

      Данный алгоритм также обладает слишком низким быстродействием.

Procedure Vstavka;

Var Z, Y, i, j: Integer;

Begin

For i := 2 to n do

For j := 1 to i-1 do

If X[j] > X[i] then

begin

Z := X[i];

For Y := i downto j+1 do X[Y] := X[Y-1];

X[j] := Z

end

End; Алгоритм сортировки выбором элемента

      В массиве необходимо найти элемент с минимальным значением и поменять его местами с первым элементом массива (для сортировки по убыванию - это необходимо сделать с максимальным элементом). После этого элемент с минимальным значением отыскивается среди всех элементов, кроме первого, и меняется значениями со вторым элементом массива и т.д. В результате все элементы выстраиваются по порядку.

      По сравнению с алгоритмами вставки и "пузырька" он в большинстве случаев может оказаться более быстрым.

      Ниже приводится текст Pascal-процедуры, реализующей один из возможных вариантов описанного алгоритма.

Procedure Vibor;

Var r, i, j: Integer;

Begin

For i := 1 to n-1 do

begin

r := i;

For j := i+1 to n do If a[r] > a[j] then r := j;

Y:=a[r]; a[r]:=a[i]; a[i]:=Y;

end

End; Алгоритм быстрой сортировки (метод Хоора)

      Метод "быстрой" сортировки, предложенный К.Хоором, основан на разделении массива на два непустых непересекающихся подмножества элементов. При этом в одной части массива должны оказаться все элементы, которые не превосходят по значению некоторый предварительно выбранный элемент массива, а в другой части - все элементы, не меньшие его. Аналогично следует поступить с каждой из полученных групп (при этом элемент для разделения можно выбирать просто из "середины" группы). На определенном этапе массив окажется полностью отсортированным.

      В подавляющем большинстве реальных случаев использование "быстрой" сортировки дает лучшие результаты по времени, чем все прочие методы.

      Ниже приводится текст Pascal-процедуры, реализующей один из возможных вариантов описанного алгоритма. В качестве параметров процедуре передаются индексы начального и конечного элементов группы.

Procedure QuickSort(Left,Right:Integer); {Left - левая граница массива}

Var I,J,Y,W,L:Integer; {Right - правая граница массива}

Begin

I:=Left;

J:=Right;

Y:=X[(Left+Right) div 2];

Repeat

While X[I]>Y do Inc(I);

While Y>X[J] do Dec(J);

If I<=J then

begin

W:=X[I];

X[I]:=X[J];

X[J]:=W;

Inc(I);

Dec(J);

end;

Until I>J;

If Left<J then QuickSort(Left,J);

If I<Right then QuickSort(I,Right);

End; Алгоритм пирамиды (метод Уильямса-Флойда)

      Метод сортировки массива, предложенный и развитый Вильямсом и Флойдом, носит название алгоритма "пирамиды". Он основан на специальном представлении массива в форме бинарного дерева, обладающего особыми свойствами и называемого "пирамидой". Алгоритм не требует дополнительной памяти. Высокая эффективность алгоритма и гарантированная надежность для самого "худшего" случая часто оказываются решающими факторами, заставляющими отдавать предпочтение этому способу сортировки.

      Процесс сортировки состоит из двух этапов. На первом этапе массив преобразуется к виду "пирамиды". На втором этапе осуществляется сортировка "пирамиды".

      Под структурой бинарного дерева понимается множество элементов, обладающих иерархией следующего вида:

X[1]

X[2] X[3]

X[4] X[5] X[6] X[7]

X[8] X[9] ................................

      Структура дерева имеет логический характер - в памяти компьютера все элементы массива все равно расположены последовательно. Каждый элемент в структуре бинарного дерева имеет два элемента-потомка X[2i] и X[2i+1], где i - индекс данного элемента. Элементы массива, являющегося "пирамидой", обладают дополнительными свойствами:

      1. Любой элемент пирамиды X[i] не меньше, чем его элементы-потомки X[2i] и X[2i+1] (соответственно первый элемент обладает максимальным значением):

      X[i] >= X[2i],

      X[i] >= X[2i+1]

      2. Любая подпоследовательность элементов вида X[n\2+1], X[n\2+2], ... X[n] также является пирамидой, обладающей свойствами 1 и 2. После преобразования массива к форме пирамиды сортировка осуществляется следующим образом.

      В массиве-пирамиде первый элемент не меньше остальных. Обменяем его с последним элементом и "укоротим" массив на 1 элемент с "хвоста". Наибольший элемент массива окажется последним. "Укороченная" последовательность элементов может уже не быть пирамидой. Поэтому рассмотрим элемент X[1] и его потомки - X[2] и X[3]. Если элемент не меньше потомков, то последовательность является пирамидой. В противном случае меняем местами элемент X[1] и наибольший из потомков: max(X[2], X[3]). Для элемента-потомка, который обменялся значением, повторяется процесс сравнения и обмена с потомками до тех пор, пока последовательность не станет пирамидой. После циклического повторения описанного этапа сортировки пирамида станет отсортированным массивом.

      Ниже приводится текст Pascal-процедуры, реализующей один из возможных вариантов описанного алгоритма.

Procedure Piramida;

Var t, k, i, Y: Integer;

Begin

For i := 2 to n do { создание структуры бинарного дерева-"пирамиды" }

begin

t := i;

while t <> 1 do

begin k := t div 2;

If X[k] >= X[t] then t := 1

else

begin

Y:=X[k]; X[k]:=X[t]; X[t]:=Y;

t := k

end

end

end;

For i := n-1 downto 1 do { сортировка массива-"пирамиды" }

begin

Y:=X[i+1]; X[1+1]:=X[i]; X[i]:=Y;

t := 1;

While t <> 0 do

begin

k := t+t;

If k > i then t := 0

else

begin

If k < i then If X[k+1] > X[k] then k := k+1;

If X[t] >= X[k] then t := 0

else

begin

Y:=X[k]; X[k]:=X[t]; X[t]:=Y;

t := k

end

end

end

end

End;

Учебно-познавательный сайт по программированию в среде Turbo Pascal

Мирошниченко Марина, Краснодар, 2003

 

Соседние файлы в папке Pascal