Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
3
Добавлен:
14.11.2017
Размер:
582.65 Кб
Скачать

Иллюстрация метода итераций

y

y=x

y=f(x)

x

0 x0 x1 x2... Кореньуравнения f(x)=x

Технология и языки программирования

31

Пример программы решения уравнения 2 sin(x) – x = 0

#include <stdio.h> #include <math.h>

double f(double);

int main(int argc, char *argv[])

{

printf("Enter initial approximation and max error (%) -> "); float x0, err;

scanf("%f%f", &x0, &err); puts("\n"); err /=100;

float x = x0;

while (fabs(f(x)-x) > err) x = f(x); printf("The root = %f\n\n", x); return 0;

}

double f(double x)

{

return 2*sin(x);

}

Программа тестировалась при значениях х0 = 1.0 и err = 0.1. Результат 1.895935 (более точно 1.89549)

Технология и языки программирования

32

Основные алгоритмы

Алгоритмы сортировки – расположения чисел или других данных в порядке возрастания или убывания их значений

Для определенности будем рассматривать методы сортировки чисел по возрастанию

Имеются 4 основных (простых) алгоритма сортировки, на основе которых строятся все другие алгоритмы:

1. Сортировка простым обменом («пузырьковая») – самый известный метод. Проходим вдоль массива чисел и на каждом шаге цикла сравниваем два соседних числа. Если они стоят по порядку (левое меньше или равно

правому), то ничего не делаем и двигаемся дальше. Если они стоят не по

порядку, то меняем их местами. Так доходим до конца массива. Заканчиваем внутренний цикл программы. Затем возвращаемся к началу массива и повторяем во внешнем цикле необходимое число раз описанный внутренний цикл, поскольку при обмене каких-то пар чисел мог испортиться порядок расположения предыдущих чисел. Если в массиве К чисел до для полной сортировки достаточно К-1 шагов внутреннего цикла и К шагов внешнего цикла. Общее число итераций пропорционально К2.

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

Для этого вводят специальный индикатор (флаг) наличия обмена.

Технология и языки программирования

33

Сортировка (продолжение)

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

отсортированной части массива. Повторяем пока не переложим в

отсортированную часть все числа. Число шагов этого алгоритма, как и предыдущего пропорционально К2.

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

отсортированной части массива, а в отсортированной части ищем место куда

его вставить – такое, чтобы слева было число меньше, а справа – больше него. Так делаем пока не вставим все числа в отсортированную часть массива.

4.Сортировка слиянием. Есть два отсортированных массива (не обязательно одинакового размера) и требуется сформировать третий массив из этих двух.

Естественно, что крайне не эффективный метод – слить массивы, а затем

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

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

быстрый алгоритм, число шагов пропорционально длине массивов. Есть еще более быстрые алгоритмы, например Quick Sort, но они здесь не рассматриваются.

Технология и языки программирования

34

Пример программы «пузырьковой» сортировки с флагом наличия обмена В программе используется перечислимый тип данных

#include <stdio.h> void swap(int*, int*);

int main(int argc, char *argv[])

{

int m[] = {3, 1, 9, 11, 7, 56, 2, 88};

int n = sizeof(m)/ sizeof(m[0]); // enumerated type of data enum {flag_up, flag_down} flag;

// flag_up - there was no any swap; flag_down - there was at least one swap do

{

flag = flag_up;

for (int i = 0; i < n; i++)

if (m[i] > m[i+1]) {swap(&m[i], &m[i+1]); flag = flag_down;}

}

while (flag == flag_down);

for (int j = 0; j < n; j++) printf("%2d ", m[j]); puts("\n"); return 0;

}

void swap(int *x, int *y)

{

int z = *x; *x = *y; *y = z; return;

}

Технология и языки программирования

35

Технология и языки программирования

36

Соседние файлы в папке Бочаров презентации 1 семестр