Анализ и построение алгоритмов
Упорядочивание, сортировка одномерного массива значений по возрастанию. Быстрое объединение двух упорядоченных массивов в один. Последовательное деление исходного массива на части с помощью рекурсии. Проверка правильности алгоритма и его реализации.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 05.01.2012 |
Размер файла | 24,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Міністерство освіти та науки України
Запорізький національний технічний університет
Кафедра комп'ютерних систем та мереж
№ зал.кн. 3.06.07.5.049
Контрольна робота
“Аналiз та побудова алгоритмiв”
Виконав студент
групи ІОТз-527
Мельнiчук О.В.
Прийняв викладач
Пiнчук В.П.
м. Запоріжжя
2011 р.
Задача 4
Выполнить упорядочивание (сортировку) одномерного массива значений по возрастанию. Тип элемента массива - целое число.
Алгоритм: метод слияния.
Описание алгоритма
В основе этого алгоритма лежат две вещи: возможность быстрого объединения двух упорядоченных массивов в один (эта процедура линейна по времени) и последовательное деление исходного массива на части с помощью рекурсии. Подробнее см. в лекциях по АПА.
Построение программы А
Программа А должна решать задачу упорядочивания массива методом слияния и служить доказательством правильности построенного (выбранного) алгоритма. Алгоритм реализуется в виде двух процедур (функций)
sort (int* A, int p, int q, int r) и p_sort(int* A, int n, int p, int r),
где n - размер исходного массива, А - имя массива (указатель на массив), . Для проверки правильности алгоритма и его реализации используются массив со случайными цифрами.
#include <syst.h>
void sort (int* A, int p, int q, int r)
{ int i,j,k, L= r-p+1;
int* x= new int[L];
i=p; j=q+1;
for (k=0;k<L;k++) { if (j>r) { x[k]= A[i]; i++; continue; }
if (i>q) { x[k]= A[j]; j++; continue; }
if (A[i]<=A[j]) { x[k]= A[i]; i++; }
else { x[k]= A[j]; j++; }
}
for (k=0;k<L;k++) A[p+k]=x[k];
delete[] x;
}
void p_sort(int* A, int n, int p, int r)
{ int q;
if (p<r) { q= (p+r)/2;
p_sort(A,n,p,q);
p_sort(A,n,q+1,r);
sort (A,p,q,r);
}
}
void main()
{ const int n = 8;
int a[n]= {8,3,5,2,3,4,5,1};
p_sort(a,n,0,n-1);
for (int i=0;i<8;i++) printf("%d ",a[i]);
puts(""); puts("Press any key..."); getch();}
массив алгоритм рекурсия сортировка
Построение программы В
Программа вычисляет таблицу функции сложности и, решает соответствующую задачу аппроксимации, определяет порядок алгоритма, т.е. порядок полинома, который соответствует функции t = F(n). Программа вычисляет таблицу функции сложности (времени выполнения) исследуемого алгоритма, выводит ее на экран и, далее, решая соответствующую задачу аппроксимации данных, находит порядок алгоритма. При этом предполагается, что алгоритм является полиномиальным, т.е. его функция сложности t = F(n) представляет собой полином относительно n порядка p, где p - порядок алгоритма.
#include <syst.h>
void merge(int* A, int p, int q, int r)
{ int i,j,k, L= r-p+1;
int* x= new int[L];
i=p; j=q+1;
for (k=0;k<L;k++) { if (j>r) { x[k]= A[i]; i++; continue; }
if (i>q) { x[k]= A[j]; j++; continue; }
if (A[i]<=A[j]) { x[k]= A[i]; i++; } // по возраст.
else { x[k]= A[j]; j++; }
}
for (k=0;k<L;k++) A[p+k]=x[k];
delete[] x;
}
void merge_sort(int* A, int n, int p, int r)
{ int q;
if (p<r) { q= (p+r)/2;
merge_sort(A,n,p,q); // рекурсивные вызовы
merge_sort(A,n,q+1,r); // функции merge_sort
merge(A,p,q,r);
}
}
const int M=8;
void main()
{ randomize();
int i,k,n=65536;
double t;
double x[M],y[M];
int* a;
for (k=0;k<M;k++)
{ a= new int[n];
for (i=0;i<n;i++) a[i]= random(1000000);
runtimer();
merge_sort(a,n,0,n-1);
t=timer();
x[k]=log2(n); y[k]=log2(t);
printf("k=%d n=%6d t=%f \n", k,n,t);
n*=2;
delete[] a;
}
double a0,a1;
linappr(M,x,y,a0,a1);
printf("\n p = %6.4f \n",a1);
delete[] a;
printf("\7"); pause;
}
p=1.1203
Результаты выполнения.
n= |
65536 |
t= |
0,015000 |
|
n= |
131072 |
t= |
0,015000 |
|
n= |
262144 |
t= |
0,063000 |
|
n= |
524288 |
t= |
0,125000 |
|
n= |
1048576 |
t= |
0,281000 |
|
n= |
2097152 |
t= |
0,594000 |
|
n= |
4194304 |
t= |
1,203000 |
|
n= |
8388608 |
t= |
2,484000 |
Задача12
Решить систему линейных уравнений порядка n. Для вычислений используется тип double.
Алгоритм Гаусса.
Описание алгоритма
Задача решается в два этапа. Вначале матрица системы приводится к верхней треугольной форме, затем вычисляются искомые величины, начиная с последней. Время выполнения первого этапа равно O(n3), время выполнения второго O(n2). Функция сложности алгоритма Гаусса в целом соответствует асимптотическому классу:
Ft(n) = O(n3) .
Построение программы А
С использованием библиотеки dalmat.h, алгоритм программы сводится к созданию матрицы, вектора правых частей и вектора решений, далее все вычисления производит функция gauss().
#include <dalmat.h>
void main()
{ int n;
printf("n = "); scanf("%d",&n);
dmatrix A(n); A.rand(0,1);
dvector B(n); B.rand(0,1);
dvector X(n);
gauss(A,B,X);
for (int i=0;i<n;i++){
printf ("X[%d] = %f", i,X[i]);
printf("\n");
}
pause;
}
Построение программы В
Программа вычисляет таблицу функции сложности (времени выполнения) исследуемого алгоритма, выводит ее на экран и, далее, решая соответствующую задачу аппроксимации данных, находит порядок алгоритма.
#include <dalmat.h>
const int M=6;
void main()
{ int k, n=256;
double t;
dmatrix A;
dvector B,X;
double x[M],y[M];
FILE* f= fopen("12_B.txt","w");
if (f==0) { puts("Cannot open the File!");
pause;
exit(0); }
fprintf(f,"%2d \n",M);
for (k=0;k<M;k++)
{ A= dmatrix(n); A.rand(0,1);
B= dvector(n); B.rand(0,1);
X= dvector(n);
runtimer();
gauss(A,B,X);
t=timer();
printf("%d. n=%2d t=%f \n",k,n,t);
fprintf(f,"%d. n= %2d t= %f \n",k,n,t);
x[k]=log2(n); y[k]=log2(t);
n=round(n*sqrt(2));
}
double a0,a1;
linappr(M,x,y,a0,a1);
fprintf(f,"\na0=%f a1=%f \n",a0,a1);
printf("\na0=%f a1=%f \n",a0,a1);
fclose(f);
puts("END\7");
pause;
}
Результаты выполнения.
n= |
256 |
t= |
0.032000 |
|
n= |
362 |
t= |
0.093000 |
|
n= |
512 |
t= |
0.250000 |
|
n= |
724 |
t= |
0.718000 |
|
n= |
1024 |
t= |
2.062000 |
|
n= |
1448 |
t= |
6.000000 |
Размещено на Allbest.ru
Подобные документы
Описание особенностей работы с массивами на С/С++. Образование адресного выражения с использованием имени массива или указателя на массив. Написание программы, которая объединяет два упорядоченных по возрастанию массива в один упорядоченный массив.
лабораторная работа [114,2 K], добавлен 25.03.2019Создание программного обеспечения, позволяющего сортировать элементы числового массива в порядке возрастания или убывания их значений. Выбор языка программирования, среды разработки и построение алгоритма. Руководство пользователя и программиста.
курсовая работа [295,4 K], добавлен 07.04.2011Разработка и реализация типовых алгоритмов обработки одномерных массивов на языке Delphi. Максимальный и минимальный элемент массива. Значение и расположение элементов массива. Элементы массива, находящиеся перед максимальным или минимальным элементом.
лабораторная работа [12,8 K], добавлен 02.12.2014Составление программы для нахождения минимального и максимального элементов массива. Программа вычисления корней квадратных алгебраических уравнений. Ранжирование одномерного массива по заданному признаку. Формирование массивов с помощью функции random.
контрольная работа [1,0 M], добавлен 30.04.2013Модификация и сравнения двух текстовых файлов. Программа, написанная на языке программирования Cи и работоспособна на IBM совместимых компьютерах. Псевдографический и графический интерфейсы. Анализ программы методом сортировки одномерного массива.
курсовая работа [116,2 K], добавлен 21.02.2008Анализ основных алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Сортировка пузырьком, методами вставок, выбора, методом Шелла, быстрая сортировка. Операция разделения массива внутренней сортировки.
курсовая работа [161,7 K], добавлен 17.12.2015Вычисление суммы положительных элементов массива. Упорядочивание элементов массива по убыванию. Решение задачи с помощью алгоритма, реализованного в среде Microsoft Visual 2008 Express. Реализация и тестирование программы. Выполнение трассировки функций.
практическая работа [146,3 K], добавлен 23.01.2015Изучение понятия и основных видов массивов. Ввод массива с клавиатуры и вывод на экран. Сортировка массивов. Метод простых обменов (пузырьковая сортировка). Сортировка простым выбором и простым включением. Решение задач с использованием массивов Паскаля.
курсовая работа [82,1 K], добавлен 18.03.2013Составление программы сортировки по возрастанию массив из 20 шестнадцатеричных чисел, просматривающей все исходные числа во внешней памяти и выбирающей самое большое число. Блок-схема алгоритма работы программы. Таблица команд и число их выполнения.
курсовая работа [23,1 K], добавлен 24.05.2015Анализ различных способов хранения информации: одномерный массив, типизированный файл и динамический список. Сортировка только положительных чисел. Словесное описание алгоритма. Блок-схема процедуры обработки данных с помощью одномерного массива.
контрольная работа [319,7 K], добавлен 29.05.2014