Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практические работы для ИС-271.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
3.07 Mб
Скачать

Лабораторная работа № 18. Методы сортировки массива в среде Turbo Pascal

Цель работы:

  • закрепить теоретические знания о методах и способах сортировки массивов

  • овладение практическими навыками составления алгоритмов и разработки на их основе программ сортировки массивов

  • закрепить практические навыки по составлению тестов и отладке программы

Оборудование:

  • программная часть – интегрированная среда Turbo Pascal 7.0

  • аппаратная часть - ПЭВМ IBM PC/XT

  • задание на выполнение работы в электронном варианте

Теоретическая часть

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

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

Следует знать:

• сортировка массивов – одно из наиболее важных действий над массивами в системах сбора и поиска информации, т. к. в отсортированных массивах найти нужную информацию можно гораздо быстрее по сравнению с несортированными;

• существует множество различных алгоритмов сортировки, которые значительно отличаются друг от друга по скорости работы;

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

Рассмотрим задачу сортировки одномерного массива Z длины N. Отсортировать массив – значит расположить его элементы в порядке роста или убывания.

Опишем метод сортировки массива в порядке роста. Сначала выполняется проход по массиву с целью определения в нем наименьшего элемента. Затем производится перестановка этого элемента с первым. Далее совершается второй проход по массиву, начиная со второго элемента. Найденный наименьший элемент переставляется со вторым и т. д. После (N-1)-го прохода с выполнением названных операций массив окажется отсортированным.

Блок-схема этого алгоритма сортировки показана на рисунке ниже. Она включает 12 блоков. После начала работы в блоке 2 переменная N и массив Z заполняются константами. Затем в блоке 3 проверяется условие о том, нужно ли сортировать массив. Это сводится к установлению факта наличия в массиве нескольких элементов, т. к. массив из одного элемента всегда отсортирован. Если этот факт установлен, то алгоритм приступает к сортировке. Процедура сортировки выполняется в цикле, объединяющем блоки 4-10. В теле этого цикла содержится другой цикл, который образован блоками 6-8. Его назначение станет ясно из дальнейшего разбора алгоритма. После входа в наружный цикл его счетчик i примет значение 1, что в рамках нашего метода подразумевает первый проход по массиву.

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

Далее будут выполнены блоки 5-10, составляющие тело наружного цикла. В блоке 5 размещены две вспомогательные переменные V и L. Первая из них предназначена для фиксирования наименьшего элемента, а вторая – для запоминания его индекса. Так как i = 1, то при первом проходе в блоке 5 V примет значение первого элемента, а L значение 1. Затем во внутреннем цикле, образованном блоками 6-8, где его счетчик j будет изменяться от 2 до N, последовательно проводится сравнение соответствующих элементов массива Z со значением переменной V. При этом всякий раз, как будет найден меньший чем v элемент, значение V будет заменено на значение этого элемента, а в переменной L будет зафиксирован его индекс. Понятно, что после выполнения внутреннего цикла в переменной V будет содержаться значение, равное наименьшему элементу, а в L – индекс этого элемента. В блоке 9 далее проверяется, не является ли наименьший элемент первым элементом массива. Если это не так, то в блоке 10 на место наименьшего элемента (его номер L) запишется первый (т. к. при первом проходе L =1 ), а на место первого элемента – наименьший (он равен V). После этого произойдет возврат управления к заголовку наружного цикла блоку 4. В нем значение счетчика станет равным i = 2. Затем вновь выполняется его тело, но уже для нового значения счетчика i. Теперь с помощью блоков 5-10 отыскивается наименьший элемент массива начиная с номера 2. Затем в блоках 9-10 он займет второе место в массиве и т. д. Когда тело наружного цикла выполнится (N-1), раз массив будет отсортирован.

В блоке 12 отсортированный массив будет выведен и в блоке 13 алгоритм окончит работу.

Рассмотрим еще два метода сортировки по невозрастанию для одного и того же массива m из 20 целых чисел. Использование одного массива позволит сравнить эффективность разных методов. Для сравнения эффективности различных способов сортировки введем целую переменную а, значение которой будет равно числу итераций (повторов просмотра массива). Для наблюдения текущего состояния массива после каждой перестановки элементов будем выводить его на экран. Для удобства отладки и тестирования массив задается в виде типизированной константы.

Линейная сортировка (сортировка отбором)

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

Линейная сортировка по невозрастанию.

const

count=20;

m: array [1..count] of byte = (9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5);

var

i,j,buf,l: byte; a: integer;

begin

writeln('Исходный массив:');

for i:=1 to count do write(' ', m[i]);

writeln; readln;

a:=0; { обнуляем счетчик итераций }

{ изменение размера неотсортированной части массива }

for i:=1 to count-1 do

{сравниваем поочередно i-й элемент неотсортированной части массива }

{ со всеми от i+1-го до конца }

for j:=i+1 to count do

begin

a:=a+1;

if m[i]<buf then

{нашли элемент, больший, чем i-й, то меняем их местами }

Begin

buf := m[i]; { buf — буфер обмена }

m[i] := m[j] ;

m[j] := buf;

end;

for 1:=1 to count do write(' ', m[l]); { после сортировки }

writeln('; итерация # ', a);

end;

end.

По последнему значению а определяем, что для данного массива линейная сортировка по невозрастанию выполняется за 190 итераций.

Сортировка методом "пузырька".

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

const count=20;

m: array [1..count] of byte = (9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5);

var

i,j,buf,l: byte; a: integer;

begin

writeln('Исходный массив:');

for i:=1 to count do

write(' ',m[i]); writeln; readln;

a:=0;

for i:=2 to count do

begin

for j:=count downto i do

begin

a:=a+1;

if m[j-1]<buf then

{слева, то "вытесняем" его влево — пузырек "всплывает" }

Begin

buf:=m[j-1]; { перестановка элементов }

m[j-l] :=m[j];

m[ j]:=buf;

for 1:=1 to count do write(' ',m[l]);

writeln('; итерация # ' ,a);

end;

end;

end;

end.

По последнему значению а определяем, что для данного массива линейная сортировка по невозрастанию пузырьковым методом выполняется за 170 итераций.

Сортировка методом парных перестановок

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

Алгоритм сортировки методом парных перестановок содержит два цикла, внутренний цикл выделен цветом.

Задания для самостоятельного выполнения

  1. Ознакомиться с алгоритмами сортировки массивов.

  2. Составить блок-схему решения задачи.

  3. Составить программу в среде Turbo Pascal 7.0.для сортировки одномерного массива в соответствии с вариантом задания, указанного в таблице.

  4. Ответить на контрольные вопросы.

  5. Результаты выполнения лабораторной работы оформить в виде отчета.

Индивидуальные задания:

№ варианта

Задания

Дан упорядоченный целочисленный массив. Сформировать второй

массив всех таких различных чисел, которые ни разу в первом массиве

не встречаются и имеют величину больше минимального и меньше

максимального из чисел первого массива.

В массиве X(N) каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все единицы, затем все двойки и, наконец, все нули (дополнительного массива не заводить).

Ввести массив a1,a2,...,a15. Требуется упорядочить его следующим образом: нулевые элементы расположить в начале массива, остальные – по убыванию.

В массиве X(N) каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все единицы, затем все двойки и, наконец, все нули (дополнительного массива не заводить).

Ввести массив a1,a2,...,a15. Упорядочить элементы массива, стоящие на нечетных местах, в возрастающем порядке, а на четных - в убывающем.

Ввести массив x1,x2,...,x20. Элементы, на нечетных местах, расположить в порядке возрастания, а на нечетных в порядке убывания.

Ввести массив a1,a2,...,a15. Требуется упорядочить его по возрастанию абсолютных значений элементов.

Из двух упорядоченных одномерных массивов (длины K и N)

сформируйте одномерный массив размером K+N, упорядоченный так

же, как исходные массивы.

Ввести массив a1,a2,...,a15. Требуется упорядочить его следующим образом: нулевые элементы расположить в конце массива, остальные – по возрастанию.

Ввести массив x1,x2,...,x20. Требуется расположить положительные элементы в порядке возрастания.

Ввести массив a1,a2,...,a15. Расположить ненулевые элементы по возрастанию.

Дана последовательность чисел а1, а2,..., аn. требуется переставить элементы так, чтобы они были расположены по убыванию.

Ввести массив x1,x2,...,x20. Требуется расположить положительные элементы в порядке убывания.

Пусть дан массив A1, A2 ,..., An. Требуется переставить элементы A1, A2,..., An так, чтобы вначале в массиве шла группа, больших того элемента, который в исходном массиве располагался на первом месте, затем сам элемент, потом - группа элементов меньших или равных ему.

Дан упорядоченный целочисленный массив. Сформировать

второй массив всех таких различных значений, которые в первом

массиве встречаются по два и более раза.

Контрольные вопросы

  1. Что понимают под сортировкой массива?

  2. Какие методы сортировки вы знаете, опишите их существенные отличия?

  3. Каким образом в Паскале задается обращение к элементу массива?

  4. Почему при описании массивов предпочтительнее употреблять константы, а не указывать размеры массива в явном виде?

  5. Что называют инициализацией массива, и зачем она применяется?

  6. Почему рекомендуется при выполнении сортировки массива не заводить дополнительный массив?

  7. Как определить: какой способ сортировки массива эффективнее?