Сортировка Джона фон Неймана - Программирование, компьютеры и кибернетика курсовая работа
Основные примеры работы процедуры слияния и обеспечение его стабильности. Листинг реализации процедуры слияния на языке программирования C++. Формализация алгоритма рекурсивным и итерационным способомами. Восходящая, гибридная и естественная сортировка.
посмотреть текст работы
скачать работу можно здесь
полная информация о работе
весь список подобных работ
Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
слияние листинг программирование алгоритм
В данной курсовой работе мы рассмотрим сортировку Джона фон Неймана.
Тема нашего исследования актуальна, она является очень важным для изучения в связи с тем, что сортировка и поиск данных - это наиболее часто встречающиеся практические задачи, возникающие при создании программного обеспечения. Сортировка слиянием -- вероятно, один из самых простых алгоритмов сортировки (среди "быстрых" алгоритмов).
Сортировка слиянием -- стабильный алгоритм сортировки. Это означает, что порядок "равных" элементов не изменяется в результате работы алгоритма. В некоторых задачах это свойство достаточно важно.
Этот алгоритм был предложен Джоном фон Нейманом в 1945 году
Везде элементы массивов нумеруются с нуля.
Целью курсовой работы является сортировка фон Неймана.
Задача изучить алгоритмы сортировки слиянием, сортировка слиянием в целом.
Предмет и объект исследования. Объектом исследования является сортировка фон Неймана. Предметом исследования - сортировка слиянием, алгоритм сортировки, процедура слияния, восходящая сортировка слиянием, гибридная сортировка и естественная сортировка.
Методы нашего исследования являются анализ, синтез, обобщение.
Допустим, у нас есть два отсортированных массива A и B размерами и соответственно, и мы хотим объединить их элементы в один большой отсортированный массив C размером . Для этого можно применить процедуру слияния, суть которой заключается в повторяющемся "отделении" элемента, наименьшего из двух имеющихся в началах исходных массивов, и присоединении этого элемента к концу результирующего массива. Элементы мы переносим до тех пор, пока один из исходных массивов не закончится. После этого оставшийся "хвост" одного из входных массивов дописывается в конец результирующего массива. Пример работы процедуры показан на рисунке:
Рис. 1. Пример работы процедуры слияния
Алгоритм слияния формально можно записать следующим образом:
Для обеспечения стабильности алгоритма сортировки нужно, чтобы в случае равенства элементов тот элемент, что идёт раньше во входном массиве, попадал в результирующий массив в первую очередь. Мы увидим далее, что если два элемента попали в разные массивы ( A и B ), то тот элемент, что шёл раньше, попадёт в массив A . Следовательно, в случае равенства элемент из массива A должен иметь приоритет. Поэтому в алгоритме стоимт знак вместо < при сравнении элементов.
Недостатком представленного алгоритма является необходимость дописывать оставшийся кусок, из-за чего при дальнейших модификациях алгоритма нам придётся писать много повторяющегося кода. Чтобы этого избежать, будем использовать чуть менее эффективный, но более короткий алгоритм, в котором копирование "хвоста" встроено в основной цикл:
Очевидно, время работы процедуры слияния составляет .
Реализация процедуры слияния на языке программирования C++ представлена в листинге 1.
template void Merge ( T const *const A, int const nA, T const *const B, int const nB, T *const C ) { //Выполнить слияние массива A, содержащего nA элементов, // и массива B, содержащего nB элементов. // Результат записать в массив C. int a ( 0 ) , b ( 0 ) ; //Номера текущих элементов в массивах A и B while ( a+b < nA+nB ) //Пока остались элементы в массивах { if ( ( b>=nB ) || ( ( a void MergeSort ( T *const A, int const n ) { //Отсортировать массив A, содержащий n элементов if ( n < 2 ) return; //Сортировка не нужна if ( n == 2 ) //Два элемента проще поменять местами, { // если нужно, чем делать слияние if ( A [ 0 ] > A [ 1 ] ) { T const t ( A [ 0 ]) ; A [ 0 ] =A [ 1 ] ; A [ 1 ] =t; } return; } MergeSort ( A , n/2 ) ; //Сортируем первую половину MergeSort ( A+n/2, n-n/2 ) ; //Сортируем вторую половину T *const B ( new T [ n ] ) ; //Сюда запишем результат слияния Merge ( A,n/2, A+n/2,n-n/2, B ) ; //Слияние половин //Копирование результата слияния в исходный массив: for ( int i ( 0 ) ; i void MergeSortIterative ( T *&A, int const n ) { //Отсортировать массив A, содержащий n элементов. // При работе указатель на A, возможно, меняется. // (Функция получает ссылку на указатель на A) T *B ( new T [ n ] ) ; //Временный буфер памяти for ( int size ( 1 ) ; size void MergeSortIter2 ( T *const A, int const n ) { //Отсортировать массив A, содержащий n элементов. T *B ( A ) ; //Буфер памяти №1 T *C ( new T [ n ] ) ; //Буфер памяти №2 for ( int size ( 1 ) ; size void HybridSort ( T *&A, int const n ) { //Отсортировать массив A, содержащий n элементов. // При работе указатель на A, возможно, меняется. // (Функция получает ссылку на указатель на A) //Размер кусочка для сортировки пирамидой: // (нужно подбирать для максимального ускорения) int const tileSize ( 4096 ) ; for ( int start ( 0 ) ; start void NaturalSort ( T *&A, int const n ) { //Отсортировать массив A, содержащий n элементов. // При работе указатель на A, возможно, меняется. // (Функция получает ссылку на указатель на A) T *B ( new T [ n ] ) ; //Временный буфер памяти while ( true ) //Выполняем слияния, пока не останется один { // отсортированный участок. Выход из цикла // находится дальше int start1 ,end1 ; //Первый отсортированный участок int start2 ( -1 ) ,end2 ( -1 ) ; //Второй отсортированный участок while ( true ) { //Цикл по всем парам отсортированных участков в массиве //Начало первого участка для слияния находится после // конца второго участка предыдущей пары: start1 = end2+1; end1 = start1; //Двигаемся вправо до нарушения сортировки: while ( ( end1Сортировка Джона фон Неймана курсовая работа. Программирование, компьютеры и кибернетика.
Эссе Дар Бораи Модар
Красивое Вступление Для Сочинения
Курсовая работа: Программа финансового оздоровления предприятия
Что Мешает Человеку Быть Счастливым Сочинение Аргументы
Структура АПК России. Проблемы его развития в условиях рыночных отношений
Реферат по теме Фольклорное начало в цикле Стивена Кинга 'Темная башня'
Химические Соединения Контрольная Работа 8 Класс
Сочинение На Тему Приключенческий Рассказ
Игры Курсовик
Курсовая работа по теме Анализ эффективности банковской системы
Эссе По Обществознанию Читать
Сочинение Дубровский И Маша Часть По Плану
Әлеуметтік Институт Ретінде Діннің Қызметтерін Анықтаңыз Реферат
Дипломная работа по теме Основные направления совершенствования критериев оценки кредитоспособности предприятий
Реферат по теме Законодательное регулирование поведения человека в чрезвычайных ситуациях
Реферат: Рабовладельческий строй
Сочинение Отец И Сын
Реферат: Эволюция представлений о пространстве
Курсовая работа: Маркетинговые исследования и сегментация рынка магазина Оптима
Крузенштерн Реферат 5 Класс
Психологія управління - Менеджмент и трудовые отношения реферат
Классификация пористости и проницаемости в зависимости от вида пустотного пространства - Геология, гидрология и геодезия презентация
Землеустройство. Земли особо охраняемых территорий - Государство и право контрольная работа