Автор работы: Пользователь скрыл имя, 26 Апреля 2012 в 21:22, курсовая работа
За время существования профессии программиста сущность его труда изменилась коренным образом. В 50-х годах программы писали в командах ЭВМ (в “машинных кодах”). При этом вся информация переводилась в двоичную систему счисления. Это очень тяжелый и напряженный труд, требующий от человека особой аккуратности. Облегченно вздохнули программисты при появлении в 1956 г. специального языка для решения вычислительных задач. Это был FORTRAN (Formula Translator). С тех пор были разработаны другие, более совершенные языки, или специализированные применительно к какой-то конкретной области: КОБОЛ, АЛГОЛ, ПЛ/1, ЛИСП, СИМУЛА, ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др.
если X[C]<P
2.2.1. то пересчитать А
2.2.2. иначе пересчитать В
2.2.1 и 2.2.2 очень ответственны. От правильности пересчета зависит окончание работы цикла. По условию 2 цикл прекратит свою работу при А=В. Как достичь этого?
Пусть мы уже сделали пересчет несколько раз и достигли соотношения А+1=В. Значит при очередном сравнении будем искать нужный элемент среди двух, расположенных рядом: X[A] и X[B]. Согласно шагу 2.1 вычисленное значение С при этом будет равно А. То есть сравнение 2.2 в этом случае выполнится как X[A]<P. Если условие истинно, то искомый элемент, возможно, есть X[B]. Тогда нужно сделать так, чтобы А стало равно В, то есть
2.2.1. A:=C+1;
Если же X[A]<P – ложно, то искомый элемент, возможно, есть X[A]. Тогда для завершения цикла полагаем
2.2.2. B:=C;
Легко проверить, что такие присваивания не противоречат выбранному нами алгоритму на любом шаге работы цикла.
3.IF X[A]=P
THEN K:=A
ELSE K:=0;
Полностью алгоритм запишется следующим образом.
Ввод (последовательность Х);
A:=1; B:=N;
WHILE A<B DO
BEGIN
C:=(A+B) DIV 2;
IF X[C]<P
THEN A:=C+1;
ELSE B:=C;
END;
IF X[A]=P
THEN K:=A;
ELSE K:=0;
Вывод (К);
Все описанные алгоритмы поиска в одномерном массиве легко обобщаются на случай массива произвольной размерности. Так, алгоритм поиска минимального элемента и его номера в матрице:
Ввод (матрица А);
min := A[1,1];
nom1 := 1;
nom2 := 1;
FOR I:=1 TO M DO
FOR J:=1 TO N DO
IF A[I,J]<min
THEN
BEGIN
min :=A[I,J];
nom1:=I;
nom2:=J;
END;
Вывод (min, nom1, nom2);
Сортировка служит хорошим примером того, что одна и та же цель может достигаться с помощью различных алгоритмов, причем каждый из них имеет свои определенные преимущества и недостатки, которые нужно оценить с точки зрения конкретной ситуации.
Под сортировкой понимают процесс перестановки элементов данного множества в определенном порядке. Цель сортировки – облегчить поиск элементов в упорядоченном множестве. В этом смысле элементы сортировки присутствуют почти во всех задачах. Упорядоченные объекты содержатся в телефонных книгах, в оглавлениях, в библиотеках, в словарях, на складах и так далее (почти всюду, где их приходится разыскивать).
Поэтому методы сортировки очень важны, особенно при обработке данных. При кажущейся простоте задачи именно с сортировкой связаны многие фундаментальные приемы построения алгоритмов, которые и интересуют нас прежде всего. Сортировка является идеальным примером огромного разнообразия алгоритмов, выполняющих одну и ту же задачу. Многие из них являются в некотором смысле оптимальными, большинство имеет какие-то преимущества перед остальными. Поэтому на примере сортировки мы убеждаемся в необходимости сравнительного анализа алгоритмов. С помощью сортировки можно прекрасно иллюстрировать многие принципы программирования и ситуации, возникающие в других задачах. Создается впечатление, что можно построить целый курс программирования, выбирая примеры только из сортировки.
Очень
часто выбор алгоритма зависит
от структуры данных. В случае сортировки
эта зависимость настолько
Пусть даны элементы а1, а2, …аN. Сортировка означает перестановку этих элементов в таком порядке ак1, ак2, …аkN, что при заданной функции упорядочения f справедливо отношение
f (ak1) ≤ f (ak2) ≤ … ≤ f (akN).
Обычно функция упорядочения не вычисляется по какому-то специальному правилу, а содержится в каждом элементе в виде явной компоненты (поля). Ее значение называется ключом элемента (key). Прочие компоненты – это все существенные данные об элементе. С точки зрения же алгоритмов сортировки ключ – единственная существенная компонента, и нет необходимости определять остальные.
Метод
сортировки называется устойчивым, если
относительный порядок
Основное требование к методам сортировки массивов – экономное использование памяти. Это означает, что упорядочение нужно проводить на том же месте, то есть методы, которые пересылают элементы из массива А в массив В, нам не интересны. Таким образом, выбирая метод сортировки по критерию экономии памяти, классификацию алгоритмов можно проводить по их эффективности, то есть быстродействию. Удобной оценкой такой эффективности является количество С необходимых сравнений ключей и М - пересылок элементов. С и М являются некоторыми функциями от числа элементов n.
Хотя хорошие алгоритмы сортировки требуют порядка n * log 2 n сравнений, обсудим вначале несколько несложных и очевидных методов сортировки, называемых простыми методами, которые требуют С ~ n2.
Причины
такого рассмотрения состоят в следующем:
В зависимости от лежащего в их основе приема простые методы сортировки на месте можно разбить на 3 группы: сортировка выбором, сортировка обменом, сортировка включениями.
Рассмотрим эти методы для простейшего случая упорядочения числовых массивов (последовательностей) по возрастанию (убыванию) значений элементов. В этом случае ключ f (ai) = ai (табл.2.1 – табл.2.3).
Номер элемента |
1 | 2 | 3 | 4 | 5 |
Исходная последовательность | 7 | 12 | 1 | 49 | 3 |
Упорядоченная по возрастанию последовательность | 1 | 3 | 7 | 12 | 49 |
Номер элемента | 1 | 2 | 3 | 4 | 5 |
Исходная последовательность | 4 | 21 | 171 | 22 | 172 |
Упорядоченная по возрастанию последовательность | 21 | 22 | 4 | 171 | 172 |
Номер элемента | 1 | 2 | 3 | 4 | 5 |
Исходная последовательность | МИР | СОН | ТУР | КОЛ | ЕЛЬ |
Упорядоченная по возрастанию последовательность | ЕЛЬ | КОЛ | МИР | СОН | ТУР |
Сортировку можно рассматривать и как самостоятельную задачу (например, получение упорядоченного по алфавиту списка сотрудников какого-либо учреждения), и как вспомогательную для облегчения последующего поиска.
Следует отметить, что все методы сортировки рассчитаны на обработку одномерных массивов. При необходимости двумерный массив всегда можно представить как одномерный путем пересчета индексов.
Будем
для определенности упорядочивать
массив А1, А2, … , АN по
возрастанию. Переход к алгоритмам упорядочения
по убыванию не составляет труда. Рассмотрим
три алгоритма, представляющие каждую
из перечисленных групп методов сортировки.
Это очень естественный способ сортировки, который обычно первым приходит на ум человеку, впервые столкнувшемуся с этой задачей.
Идея метода такова. Найдем в последовательности элемент с наименьшим значением и поменяем его местами с первым элементом. Затем проделаем те же действия с оставшимися N-1 элементами, затем с N-2 и так далее до тех пор, пока не останется один элемент – последний. Он будет наибольшим.
Проиллюстрируем процесс (табл.2.4).
Номер элемента | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Исходная последовательность | 72 | 14 | 6 | 98 | 17 | 51 | 25 | 33 |
После выбора среди 8 элементов | 6 | 14 | 72 | 98 | 17 | 51 | 25 | 33 |
7 элементов | 6 | 14 | 72 | 98 | 17 | 51 | 25 | 33 |
6 элементов | 6 | 14 | 17 | 98 | 72 | 51 | 25 | 33 |
5 элементов | 6 | 14 | 17 | 25 | 72 | 51 | 98 | 33 |
4 элементов | 6 | 14 | 17 | 25 | 33 | 51 | 98 | 72 |
3 элементов | 6 | 14 | 17 | 25 | 33 | 51 | 98 | 72 |
|
6 | 14 | 17 | 25 | 33 | 51 | 72 | 98 |
Упорядоченная последовательность | 6 | 14 | 17 | 25 | 33 | 51 | 72 | 98 |