
- •Понятия алгоритма и программы. Свойства алгоритмов. Составление алгоритмов различной структуры.
- •Описание и типы алгоритмов поиска. Примеры.
- •Арифметические операции. Операции отношения. Операции инкремента и декремента в языке программирования с.
- •6)Понятие указателя, объявление указателя. Операции над указателями.
- •7.Описание и определение пользовательских функций в языке программирования с.
- •8. Строковый тип данных и функции работы с ними в языке программирования с.
- •9. Организация работы с файлами. Функции работы с файлами в языке программирования с.
- •10)Динамические структуры данных в с. Абстрактные типы данных.
Понятия алгоритма и программы. Свойства алгоритмов. Составление алгоритмов различной структуры.
Алгоритм – это упорядоченная совокупность точных (формализованных) и полных команд исполнителю алгоритма (человек, ЭВМ), задающих порядок и содержание действий, которые он должен выполнить для нахождения решения любой задачи из рассматриваемого класса задач.
Алгоритм удовлетворяет следующим основным свойствам:
Конечность (дискретность) команд и выполняемых по ним действий алгоритма.
Выполнимость в определенной операционной среде (в определенном классе исполнителей).
Результативность отдельных команд и всего алгоритма.
Применимость алгоритма ко всем возможным входным данным конкретного класса задач.
Определенность (детерминированность) команд и всего алгоритма для всех входных данных.
Формализованное, конструктивное описание (представление) команд алгоритма.
Минимальная полнота системы команд алгоритм.
Непротиворечивость любых команд алгоритма на любом наборе входных данных.
Любой алгоритм ориентирован на некоторый общий метод решения класса задач и представляет собой формализованную запись метода, процедуры.
Принципы разработки алгоритмов и программ
Типы алгоритмических процессов по структуре выполнения алгоритмы и программы делятся на три вида:
Линейные
Ветвящиеся
Циклические
Линейный алгоритм (линейная структура) – это такой алгоритм, в котором все действия выполняются последовательно друг за другом и только один раз. Схема представляет собой последовательность блоков, которые располагаются сверху вниз в порядке их выполнения. Первичные и промежуточные данные не оказывают влияния на направление процесса вычисления.
Алгоритмы разветвляющейся структуры
В таких алгоритмах выбор направления продолжения вычисления осуществляется по итогам проверки заданного условия. Ветвящиеся процессы описываются оператором IF (условие).
Циклические вычислительные процессы
Для решения многих задач характерно многократное повторение отдельных участков вычислений. Для решения таких задач применяются алгоритмы циклической структуры (циклические алгоритмы). Цикл – последовательность команд, которая повторяется до тех пор, пока не будет выполнено заданное условие. Циклическое описание многократно повторяемых процессов значительно снижает трудоемкость написания программ.
Существуют две схемы циклических вычислительных процессов.
Особенностью первой схемы является то, что проверка условия выхода из цикла проводится до выполнения тела цикла. В том случае, если условие выхода из цикла выполняется, то тело цикла не выполняется ни разу.
Особенностью второй схемы является то, что цикл выполняется хоты бы один раз, так как первая проверка условия выхода из цикла осуществляется после того, как тело цикла выполнено.
Существуют циклы с известным числом повторений и итерационные циклы. При итерационном цикле выход из тела цикла, как правило, происходит при достижении заданной точности вычисления.
Описание и типы алгоритмов поиска. Примеры.
Поиск – процесс нахождения конкретной информации в ранее созданном множестве данных.
Последовательный (линейный) поиск
Бинарный (двоичный) поиск
Последовательный (линейный) поиск – это простейший вид поиска заданного элемента на некотором множестве, осуществляемый путем последовательного сравнения очередного рассматриваемого значения с искомым до тех пор, пока эти значения не совпадут.
Алгоритм последовательного поиска
Шаг 1. Полагаем, что значение переменной цикла i=0.
Шаг 2. Если значение элемента массива x[i] равно значению ключа key, то возвращаем значение, равное номеру искомого элемента, и алгоритм завершает работу. В противном случае значение переменной цикла увеличивается на единицу i=i+1.
Шаг 3. Если i<k, где k – число элементов массива x, то выполняется Шаг 2, в противном случае – работа алгоритма завершена и возвращается значение равное -1.
При наличии в массиве нескольких элементов со значением key данный алгоритм находит только первый из них (с наименьшим индексом).
int LinearSearch(int *x, int k, int key){
int i = 0;
for ( i = 0 ; i < k ; i++ )
if ( x[i] == key )
break;
return i < k ? i : -1;
}
Время выполнения данного алгоритма поиска для вещественных чисел , где n – количество элементов множества, а – точность. Поиск на дискретном множестве из n элементов осуществляется в худшем случае за n итераций, а в среднем этот алгоритм требует n/2 итераций цикла.
Недостатком рассматриваемого алгоритма поиска является то, что в худшем случае осуществляется просмотр всего массива. Поэтому данный алгоритм используется, если множество содержит небольшое количество элементов.
Достоинства последовательного поиска заключаются в том, что он прост в реализации, не требует сортировки значений множества, дополнительной памяти и дополнительного анализа функций. Следовательно, может работать в потоковом режиме при непосредственном получении данных из любого источника.
Бинарный (двоичный, дихотомический) поиск – это поиск заданного элемента на упорядоченном множестве, осуществляемый путем неоднократного деления этого множества на две части таким образом, что искомый элемент попадает в одну из этих частей. Поиск заканчивается при совпадении искомого элемента с элементом, который является границей между частями множества или при отсутствии искомого элемента.
Бинарный поиск применяется к отсортированным множествам и заключается в последовательном разбиении множества пополам и поиска элемента только в одной половине на каждой итерации.
Таким образом, идея этого метода заключается в следующем. Поиск нужного значения среди элементов упорядоченного массива (по возрастанию или по убыванию) начинается с определения значения центрального элемента этого массива. Значение данного элемента сравнивается с искомым значением и в зависимости от результатов сравнения предпринимаются определенные действия. Если искомое и центральное значения оказываются равны, то поиск завершается успешно. Если искомое значение меньше центрального или больше, то формируется массив, состоящий из элементов, находящихся слева или справа от центрального соответственно. Затем поиск повторяется в новом массиве (рис. 37.1).
Алгоритм бинарного поиска
Шаг 1. Определить номер среднего элемента массива middle=(high+low)/2.
Шаг 2. Если значение среднего элемента массива равно искомому, то возвращаем значение, равное номеру искомого элемента, и алгоритм завершает работу.
Шаг 3. Если искомое значение больше значения среднего элемента, то возьмем в качестве массива все элементы справа от среднего, иначе возьмем в качестве массива все элементы слева от среднего (в зависимости от характера упорядоченности). Перейдем к Шагу 1.
#include <iostream>
using namespace std;
int BinSearch(const int* arr, int count, int key);
int main()
{
const int n = 5;
int arr[n] = {1, 2, 3, 4, 5};
int key;
cout << "key: ";
cin >> key;
if(BinSearch(arr, n, key) != -1)
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
int BinSearch(const int* arr, int count, int key)
{
int l = 0; // нижняя граница
int u = count - 1; // верхняя граница
while (l <= u) {
int m = (l + u) / 2;
if (arr[m] == key) return m;
if (arr[m] < key) l = m + 1;
if (arr[m] > key) u = m - 1;
}
return -1;
}
Описание и виды алгоритмов сортировки. Примеры.
Алгоритм сортировки — это алгоритм для упорядочения элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки.
Внешняя сортировка – это алгоритм сортировки, который при проведении упорядочивания данных использует внешнюю память, как правило, жесткие диски.
Внутренняя сортировка – это алгоритм сортировки, который в процессе упорядочивания данных использует только оперативную память (ОЗУ) компьютера.
Виды:
Сортировка пузырьком - Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован.
Бинарная пирамидальная сортировка – это алгоритм внутренней сортировки, основанный на построении пирамиды и просеивании элементов из ее вершины методом спуска вниз в соответствии с ключом сортировки.
Быстрая сортировка – это общее название ряда алгоритмов, которые отражают различные подходы к получению критичного параметра, влияющего на производительность метода.
выбрать элемент, называемый опорным.
сравнить все остальные элементы с опорным, на основании сравнения разбить множество на два — «меньшие опорного» и «большие», расположить их в порядке меньшие -большие.повторить рекурсивно для «меньших» и «больших».
//алгоритм на языке java
public static void qSort(int[] A, int low, int high) {
int i = low;
int j = high;
int x = A[(low+high)/2];
do {
while(A[i] < x) ++i;
while(A[j] > x) --j;
if(i <= j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
i++; j--;
}
} while(i <= j);
if(low < j) qSort(A, low, j);
if(i < high) qSort(A, i, high);
}
Сортировка перемешиванием
Сортировка вставками
Блочная сортировка
Сортировка выбором
Сортировка Шелла