Главная страница
Навигация по странице:

  • КАФЕДРА

  • ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТ по дисциплине: Структуры и алгоритмы обработки данныхТема задания и исходные данные

  • Пояснительная записка

  • Проектная часть

  • Приложение Листинг программы Дата выдачи

  • QuickSort.cpp

  • PyramidSort.cpp

  • PyramidSort.h

  • Курсовая. Исследование улучшенных методов сортировки (быстрая и пирамидальная сортировки)


    Скачать 0.79 Mb.
    НазваниеИсследование улучшенных методов сортировки (быстрая и пирамидальная сортировки)
    Дата07.10.2022
    Размер0.79 Mb.
    Формат файлаdocx
    Имя файлаКурсовая.docx
    ТипКурсовой проект
    #719317



    Федеральное агентство связи

    Бурятский институт инфокоммуникаций

    Федеральное государственное образовательное бюджетное учреждение

    высшего образования «Сибирский государственный университет телекоммуникаций и информатики»
    КАФЕДРА Информатики и вычислительной техники и ОПД

    КУРСОВОЙ ПРОЕКТ
    по дисциплине: Структуры и алгоритмы обработки данных

    на тему: «Исследование улучшенных методов сортировки (быстрая и пирамидальная сортировки)»

    Выполнил:

    Студент 2 курса, ИТ-19 группы,

    заочной формы обучения,

    направления ИТ

    Ф.И.О. Бородина Елена Ивановна

    Руководитель__________________/Елтунова Инга Баировна/

    (подпись, инициалы, фамилия)

    Улан-Удэ 2021 г.

    ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

    БИИК «СибГУТИ»

    Кафедра «Информатики и вычислительной техники и ОПД»
    Рассмотрено

    На кафедре «ИВТ и ОПД»

    Зав. кафедры

    Елтунова И.Б. //

    «»2021г.
    ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТ
    по дисциплине: Структуры и алгоритмы обработки данных
    Тема задания и исходные данные

    Разработать программу на любом языке программирования для исследования улучшенных методов сортировки.

    Программа должна формировать массивы по 10, 100, 1000 и 10000 элементов, подсчитывать количество сравнений и перестановок.

    Все полученные результаты отобразить на экране.
    Пояснительная записка

    1. Введение

    2. Теоретическая часть

    3. Проектная часть

    4. Заключение

    5. Список, использованных источников


    Проектная часть

    1. Структура основной программы. Описание основной программы.

    2. Структура модуля работы с файлами, функции содержащиеся в модуле (описание блок-схемы и текста подпрограммы)


    Приложение

    1. Листинг программы



    Дата выдачи « » 2021 г.

    Срок окончания « » 2021 г.                       

    Руководитель курсовой работы /Елтунова И.Б./

     Задание принял к исполнению

    СОДЕРЖАНИЕ

    ВВЕДЕНИЕ................................................................................................................4

        1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ...............................................................................5

      1. Алгоритмы сортировки данных, методы сортировки данных….......5

      2. Быстрая сортировка................................................................................8

      3. Пирамидальная сортировка .................................................................11

    1. ПРАКТИЧЕСКАЯ ЧАСТЬ...............................................................................15

      1. Постановка задачи.................................................................................15

      2. Программирование задачи....................................................................16

      3. Результаты исследования......................................................................20

    ЗАКЛЮЧЕНИЕ........................................................................................................24

    СПИСОК ЛИТЕРАТУРЫ........................................................................................25

    ПРИЛОЖЕНИЕ.........................................................................................................26


    ВВЕДЕНИЕ

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

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

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

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

    Программирование содержит целый ряд важных внутренних задач. Одной из наиболее важных задач для программирования является задача сортировки.
    1.ТЕОРИТИЧЕСКАЯ ЧАСТЬ

    1.1. Алгоритмы сортировки данных, методы сортировки

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

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

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

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

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

    Алгоритмы сортировки имеют большое практическое применение. Их можно встретить почти везде, где речь идет об обработке и хранении больших объемов информации. Некоторые задачи обработки данных решаются проще, если данные упорядочены.

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

    - Обменная сортировка – состоит в систематическом обмене элементов, нарушающих упорядоченность, пока они существуют.

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

    - Сортировка вставками – состоит в простых вставках, когда элементы уже отсортированного массива перебираются последовательно.

    - Блочная сортировка (метод Шелла) – идея состоит в том, что обмен элементов, расположенных не только рядом, но и далеко друг от друга, что значительно сокращает общее число операций перемещения элементов.

    - Сортировка слиянием – принцип работы такой сортировки заключается в том, что массив разбивается на две части, сортируется каждая из частей, а потом сливается в одну отсортированную.

    - Пирамидальная сортировка (ее мы рассмотрим чуть позже)

    - Линейная сортировка – последовательно рассматривается весь массив, отыскивается наибольшее число и помещается рядом с элементом, занимающим первую позицию.

    - Метод быстрой сортировки с разделением (его мы тоже рассмотрим чуть позже).

    1.2 Быстрая сортировка

    Метод быстрой сортировки был разработан в 1960 году Ч.Ф.Р. Хоаром и он же дал ему это название. В настоящее время этот метод считается наилучшим, основанным на использовании обменного метода сортировки.

    В основе быстрой сортировки лежит принцип разбиения. Сначала выбирается некоторое значение в качестве «основы» и затем разбивается весь массивна две части. Одну часть составляют все элементы, равные или больше «основы», а другую часть составляют все элементы меньшего значения. Этот процесс продолжается до тех пор, пока весь массив не будет отсортирован. Фактически этот процесс имеет рекурсивную природу. Базой рекурсии являются списки, состоящие из одного или двух элементов, которые уже отсортированы. Алгоритм всегда завершается, поскольку за каждую итерацию он ставит по крайней мере один элемент на его окончательное место.

    Быстрая сортировка дает в среднем O (n log n) сравнений при сортировке n элементов. В худшем случае, однако, получается O ( ) сравнений. Следует отметить одно неприятное свойство быстрой сортировки, если выбираемое число оказывается совпадающим с максимальным значением, то быстрая сортировка превращается в самую медленную с временем выполнения n. Обычно на практике быстрая сортировка значительно быстрее, чем другие алгоритмы с оценкой O (n log n), по причине того, что внутренний цикл алгоритма может быть эффективно реализован почти при любой архитектуре, и на большинстве реальных данных найти решения, которые минимизируют вероятность того, что понадобится квадратичное время.

    Пример реализации быстрой сортировки:

    void gsortRecursive(int *mas, int size) {

    //Указатели в начало и в конец массива

    int i = 0;

    int j = size - 1;
    //Центральный элемент массива

    int mid = mas[size / 2];
    //Делим массив

    do {

    //Пробегаем все элементы, ищем те, что надо перекинуть в другую часть

    //В левой части пропускаем элементы, которые меньше центрального

    while(mas[i] < mid)

    i++;

    }

    //В правой части пропускаем элементы, которые больше центрального

    while(mas[j] > mid) {

    j--;

    }
    //Меняем элементы местами

    if (i <= j) {

    int tmp = mas[i];

    mas[i] = mas[j];

    mas[j] = tmp;
    i++;

    j--;

    }

    } while (i <= j);
    //Рекурсивные вызовы, если осталось, что сортировать

    if (i < size) {

    //"Правый кусок"

    gsortRecursive(&mas[i], size - i);

    }

    }


    1.3 Пирамидальная сортировка

    Пирамидальная сортировка в некотором роде является модификацией сортировки выбором, с тем лишь отличием, что минимальный и максимальный элемент неотсортированного массива выбирается не за O (n) операций, а за O (

    Log n). Соответственно и производительность такого метода будет не

    O ( ), а O (n*log n), т.е. наиболее быстрая для сортировки.

    Суть метода:

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

    Основные итерации:

    - вынимаем вершину пирамиды;

    - на ее место встает последний в пирамиде элемент;

    - «просеиваем» этот элемент сквозь пирамиду;

    - восстанавливаем пирамиду.

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

    Имеются две особенности алгоритма:

    - Алгоритм относительно медленно работает, когда число сортируемых элементов менее 100. Для малого количества элементов желательно использовать сортировочные сети.

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

    Реализация пирамидальной сортировки на Си:

    #include

    #include

    //Функция "просеивания" через кучу - формирование кучи

    void siftDown(int *numders, int root, int bottom)

    {

    int maxChild; //индекс максимального потомка

    int done = 0; //флаг того, что куча сформирована

    //пока не дошли до последнего ряда

    while ((root * 2 <= bottom) && (!done))

    {

    if (root * 2 == bottom) //если мы в последнем ряду

    maxChild = root * 2 //запоминаем левый поток

    //иначе запоминаем большой потомок из двух

    else if (numbers[root * 2] > numbers[root * 2 +1])

    maxChild = root * 2;

    else

    maxChild = root * 2 + 1

    //если элемент вершины меньше максимального потомка

    if (numbers[root] < numers[maxChild])

    {

    int temp = numers[root]; //меняем их местами

    numbers[root] =n numbers[maxChild] = temp;

    riit = maxChild;

    }

    else

    done = 1; //пирамида сформирована

    }

    }

    //функция сортировки на куче

    void heapSort(int *numbers, int array_size)

    {

    //формируем нижний ряд пирамиды

    for (int i = (array_size / 2); i >= 0; i--)

    siftDown(numbers, i, array_size - 1);

    //просеиваем через пирамиду остальные элементы

    for (int i = array_size - 1; i >= 1; i--)

    {

    int temp = numbers[0];

    numbers[0] = numbers[i];

    numbers[i] = temp;

    siftDown(numbers, i - 1);

    }

    }

    int main()

    {

    int f[10];

    // заполнение массива случайными числами

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

    a[i] = rand() % 20 - 10;

    //вывод элементов массива до сортировки

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

    printf("%d ", a[i]);

    printf("\n");

    headSort(a, 10); //вызов функции сортировки

    //вывод элементов массива после сортировки

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

    printf("%d ", a[i]);

    printf("\n");

    getchar();

    return 0;

    }

    2.ПРАКТИЧЕСКАЯ ЧАСТЬ

    2.1. Постановка задачи

    1.Осуществить исследование улучшенных методов сортировки:

    - быстрая сортировка

    - пирамидальная сортировка

    2.Исследование осуществить, используя массивы упорядоченных по возрастанию, убыванию и неупорядоченных чисел по 10,100,1000 и 10000 элементов.

    3.Сравнить количество перестановок и сравнений. Результаты оформить в виде таблиц, графиков.

    4.Реализовать исследование с помощью любого языка программирования (для реализации поставленной задачи мы используем язык программирования С++).

    5.Результаты исследования вывести на экран.


    2.2. Программирование задачи

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

          1. Вводился размер массива.

          2. Производилась сортировка согласно заданным условиям (по возрастанию, по убыванию).

          3. Подсчитывала количество сравнений, перестановок.

          4. Выводила результаты на экран.

    Для этого пропишем условия исполнения к каждому методу сортировки (реализация показана на примере быстрой сортировки).

    - Сортировка по возрастанию:

    void QuickSort::Launch(int* x, int size) {

    long i = 0, j = size ; // начальные значения

    int temp, p;

    p = x[ size>>1 ];

    do {

    while (x[i] < p){

    i++;

    this->CountEquals();

    }

    while (x[j] > p){

    j--;

    this->CountEquals();

    }

    - Сортировка по убыванию:

    oid QuickSort::Launch1(int* x, int size) {

    long i = 0, j = size ; // начальные значения

    int temp, p;

    p = x[ size>>1 ];

    do {

    while (x[i] > p){

    i++;

    this->CountEquals();

    }

    while (x[j] < p){

    j--;

    this->CountEquals();

    }

    - счетчик перестановок, сравнений: if (i <= j) {

    temp = x[i]; x[i] = x[j]; x[j] = temp;

    this->CountSwap();

    i++; j--;

    }

    Отдельно прописываются все функции и для пирамидальной сортировки. После описания всех условий исследования, переходим к тестированию.

    В начале выполнения программы в окне консоли выходит сообщение: “Vvtdite razmer massiva”, где пользователь вводит размер массива, исходя из полученной задачи.



    Рис.1
    После введения размера массива, на экране появляются данные по сортировке массива (элементы сортируются согласно прописанным условиям), а также имеются данные по количеству перестановок и сравнений.



    Рис.2

    2.3.Результаты исследования.

    Исследование заключается в следующем: берут три массива с одинаковым количеством элементов, но один из них упорядоченный по возрастанию, второй - по убыванию, а третий - случайный. Осуществляется сортировка данных массивов и сравнивается количество перемещений элементов при сортировке первого, второго и третьего массивов, а также сравнивается количество сравнений при сортировке. Вышеописанный способ применяется для массивов, состоящих из 10, 100, 1000 и 10000 упорядоченных и неупорядоченных элементов для всех методов сортировки.

    Сортировка на 10 элементов:

     

     

    Быстрая

    Пирамидальная

    в неупорядоченном списке

    перестановки

    11

    50

    сравнения

    16

    58

    в упорядоченном по возрастанию

    перестановки

    6

    52

    сравнения

    19

    58

    в упорядоченном по убыванию

    перестановки

    6

    52

    сравнения

    19

    58



    Сортировка на 100 элементов:







    Быстрая

    Пирамидальная

    в неупорядоченном списке


    перестановки

    194

    827

    сравнения

    359

    1238

    в упорядоченном по возрастанию


    перестановки

    83

    800

    сравнения

    485

    1286

    в упорядоченном по убыванию


    перестановки

    83

    884

    сравнения

    486

    1288



    Сортировка на 1000 элементов:

     

     

    Быстрая

    Пирамидальная

    в неупорядоченном списке

    перестановки

    46093

    148181

    сравнения

    57793

    254112

    в упорядоченном по возрастанию

    перестановки

    30560

    139808

    сравнения

    70886

    236426

    в упорядоченном по убыванию

    перестановки

    30560

    139850

    сравнения

    70886

    236712



    Контрольный пример:
    Дан массив из 25 случайно заполненных элементов. Необходимо отсортировать данный массив, посчитать количество перестановок, сравнений в массиве, отсортированном по возрастанию, убыванию.
    Получаем:


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

    ЗАКЛЮЧЕНИЕ

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

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

    СПИСОК ЛИТЕРАТУРЫ:

    1.Бабенко М.А., Левин М.В. Введение в теорию алгоритмов и структур данных. – М.:МЦНМО. 2020

    2.Круз Р.Л. Структуры данных и проектирование программ – М.: Бином. Лаборатория знаний. 2014

    3.Кнут Д. Искусство программирования для ЭВМ Том 1 Основные алгоритмы (3-е изд.: Уч.пос.-М.:Издательский дом «Вильямс», 2000)

    4.Бабенко М.А. Введение в теорию алгоритмов и структур данных. 2016

    ПРИЛОЖЕНИЕ

    Листинг программы

    Main.cpp

    #include

    #include

    #include "Insert.h"

    #include "QuickSort.h"

    #include "PyramidSort.h"

    #include "Sort.h"
    using namespace std;
    int main(void)

    {

    int n = 0;

    cout << "Vvtdite razmer massiva: ";

    cin >> n;

    cout << endl;

    if(n > 0){

    QuickSort* q = new QuickSort(n, new int[n]);

    QuickSort* q1 = new QuickSort(n, new int[n]);

    PyramidSort* p = new PyramidSort(n, new int[n]);

    PyramidSort* p1 = new PyramidSort(n, new int[n]);

    q->RandomFill(0,100);

    memcpy(p->getArr(), q->getArr(), n*sizeof(int));

    memcpy(q1->getArr(), q->getArr(), n*sizeof(int));

    memcpy(p1->getArr(), q->getArr(), n*sizeof(int));

    cout << q->getName() << ": " << endl << "Ishodnye dannie: ";

    q->Print();

    q->Run(false);

    cout << "Rez sortirovki: ";

    q->Print();

    cout << "Ne uporyadochennyi Kol-vo perestanovok: " << q->getSwapNum() << endl;

    cout << "Ne uporyadochennyi Kol-vo sravneniy: " << q->getCountEquals() << endl;

    q->setArr(q->getArr());

    q->Run(false);

    cout << "Uporyadochennyi Kol-vo perestanovok: " << q->getSwapNum() << endl;

    cout << "Uporyadochennyi Kol-vo sravneniy: " << q->getCountEquals() << endl << endl;


    cout << q1->getName() << ": " << endl << "Ishodnye dannie: ";

    q1->Print();

    q1->Run(true);

    cout << "Rez sortirovki: ";

    q1->Print();

    q1->setArr(q1->getArr());

    q1->Run(true);

    cout << "Uporyadochennyi Kol-vo perestanovok: " << q1->getSwapNum() << endl;

    cout << "Uporyadochennyi Kol-vo sravneniy: " << q1->getCountEquals() << endl << endl;

    cout << p->getName() << ": " << endl << "Ishodnye dannie: ";

    p->Print();

    p->Run(true);

    cout << "Rez sortirovki: ";

    p->Print();

    cout << "Ne uporyadochennyi Kol-vo perestanovok: " << p->getSwapNum() << endl;

    cout << "Ne uporyadochennyi Kol-vo sravneniy: " << p->getCountEquals() << endl;

    p->setArr(p->getArr());

    p->Run(true);

    cout << "Uporyadochennyi Kol-vo perestanovok: " << p->getSwapNum() << endl;

    cout << "Uporyadochennyi Kol-vo sravneniy: " << p->getCountEquals() << endl << endl;

    cout << p1->getName() << ": " << endl << "Ishodnye dannie: ";

    p1->Print();

    p1->Run(false);

    cout << "Rez sortirovki: ";

    p1->Print();

    p1->setArr(p1->getArr());

    p1->Run(false);

    cout << "Uporyadochennyi Kol-vo perestanovok: " << p1->getSwapNum() << endl;

    cout << "Uporyadochennyi Kol-vo sravneniy: " << p1->getCountEquals() << endl << endl;

    }

    return 0;

    }

    Sort.h

    #pragma once

    #include

    #include

    #include

    using namespace std;

    class Sort

    {

    protected:

    int n;

    int* x;

    int swapNum;

    int countEquals;

    char* algName;

    public:

    Sort(int, int*);

    Sort();

    virtual void Run(void);

    int* getArr(void);

    void setArr(int*);

    int getSize(void);

    void setSize(int);

    int getSwapNum(void);

    int getCountEquals(void);

    void DisableSwapCount(void);

    void CountSwap(void);

    void CountEquals(void);

    void Print(void);

    void Print2(int*, int);

    void RandomFill(int, int);

    char* getName(void);

    void Swap(int, int);

    void CopyTo(int*);

    Sort(void);

    };

    Sort.cpp

    #include "Sort.h"

    using namespace std;
    Sort::Sort()

    {

    this->setSize(0);

    this->swapNum = 0;

    this->countEquals=0;

    }

    Sort::Sort(int n, int* x)

    {

    this->setArr(x);

    this->setSize(n);

    this->swapNum = 0;

    this->countEquals=0;

    this->algName = (char*)"Default Sort";

    }

    void Sort::Run(void) {

    }

    int* Sort::getArr(void) {

    return this->x;

    }

    void Sort::setArr(int* x) {

    this->swapNum = 0;

    this->countEquals=0;

    this->x = x;

    }

    int Sort::getSize(void) {

    return this->n;

    }

    void Sort::setSize(int n) {

    this->n = n;

    }

    char* Sort::getName(void) {

    return this->algName;

    }

    int Sort::getSwapNum(void) {

    return this->swapNum;

    }
    int Sort::getCountEquals(void) {

    return this->countEquals;

    }

    void Sort::CountSwap() {

    this->swapNum++;

    }
    void Sort::CountEquals() {

    this->countEquals++;

    }
    void Sort::Print(void) {

    for (int i = 0; i < this->n; i++) {

    cout << this->x[i] << ' ';

    }

    cout << endl;

    }

    void Sort::RandomFill(int left = 0, int right = 100) {

    srand( (unsigned int)time(NULL)/2);

    for (int i = 0; i < this->n; i++) {

    this->x[i] = left + rand() % (right - left);

    }

    }

    void Sort::Swap(int i, int j) {

    int tmp;

    tmp = this->x[i]; this->x[i] = this->x[j]; this->x[j] = tmp;

    this->CountSwap();

    }

    void Sort::CopyTo(int* dest) {

    for (int i = 0; i < this->n; i++) {

    dest[i] = this->x[i];

    }

    }

    void Sort::Print2(int* arr, int n) {

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

    cout << arr[i] << ' ';

    }

    cout << endl;

    }

    Sort::Sort()

    {

    delete[] this->x;

    }

    QuickSort.cpp

    #include "QuickSort.h"
    QuickSort::QuickSort(int n, int* x) : Sort(n, x) {

    this->algName = (char*)"Quick Sort [Center]";

    }

    void QuickSort::Run(bool m)

    {

    if(m)

    this->Launch1(this->x, this->n-1);

    else

    this->Launch(this->x, this->n-1);

    }

    void QuickSort::Launch(int* x, int size) {

    long i = 0, j = size ; // начальные значения

    int temp, p;

    p = x[ size>>1 ];

    do {

    while (x[i] < p){

    i++;

    this->CountEquals();

    }

    while (x[j] > p){

    j--;

    this->CountEquals();

    }

    if (i <= j) {

    temp = x[i]; x[i] = x[j]; x[j] = temp;

    this->CountSwap();

    i++; j--;

    }

    } while (i <= j);

    if ( j > 0 ) this->Launch(x, j);

    if ( size > i ) this->Launch(x+i, size-i);

    }

    void QuickSort::Launch1(int* x, int size) {

    long i = 0, j = size ; // начальные значения

    int temp, p;

    p = x[ size>>1 ];

    do {

    while (x[i] > p){

    i++;

    this->CountEquals();

    }

    while (x[j] < p){

    j--;

    this->CountEquals();

    }

    if (i <= j) {

    temp = x[i]; x[i] = x[j]; x[j] = temp;

    this->CountSwap();

    i++; j--;

    }

    } while (i <= j);

    if ( j > 0 ) this->Launch1(x, j);

    if ( size > i ) this->Launch1(x+i, size-i);

    }

    QuickSort::QuickSort()

    {

    }

    QuickSort.h

    #pragma once

    #include "Sort.h"

    #include "Insert.h"

    class QuickSort :

    public Sort

    {

    protected:

    Insert simpleSortObj;

    public:

    QuickSort(int, int*);

    void Run(bool);

    void Launch(int*, int);

    void Launch1(int*, int);

    public:

    QuickSort(void);

    };

    PyramidSort.cpp

    #include "PyramidSort.h"
    PyramidSort::PyramidSort(int n, int* x) : Sort(n, x) {

    this->algName = (char*)"Pyramid Sort";

    }

    void PyramidSort::Screening(int k, int end) {

    /* Это чтобы при k=0 и n=0 не делалось лишней

    перестановки*/

    if (0 == end) return;

    int tmp;

    int childPos;

    tmp = this->x[k];

    while (k <= end/2) {

    childPos = 2*k; // Левый ребенок элемента k

    /* выбираем большего ребенка элемента k

    из 2-х: либо левый, либо правый

    */

    this->CountEquals();

    if (childPos < end && this->x[childPos] < this->x[childPos + 1]) {

    childPos++;

    }

    /* Если родитель x[k] больше всех своих детей,

    то ничего не делаем, он стоит на правильном месте */

    this->CountEquals();

    if(tmp >= this->x[childPos]) break;

    // иначе - меняем x[k] с наибольшим ребенком

    this->x[k] = this->x[childPos];

    k = childPos;

    this->CountSwap();

    }

    this->x[k] = tmp; this->CountSwap();

    }
    void PyramidSort::Screening1(int k, int end) {

    /* Это чтобы при k=0 и n=0 не делалось лишней

    перестановки*/

    if (0 == end) return;

    int tmp;

    int childPos;

    tmp = this->x[k];

    while (k <= end/2) {

    childPos = 2*k; // Левый ребенок элемента k

    /* выбираем большего ребенка элемента k

    из 2-х: либо левый, либо правый

    */

    this->CountEquals();

    if (childPos < end && this->x[childPos] > this->x[childPos + 1]) {

    childPos++;

    }

    /* Если родитель x[k] больше всех своих детей,

    то ничего не делаем, он стоит на правильном месте */

    this->CountEquals();

    if(tmp <= this->x[childPos]) break;

    // иначе - меняем x[k] с наибольшим ребенком

    this->x[k] = this->x[childPos];

    k = childPos;

    this->CountSwap();

    }

    this->x[k] = tmp; this->CountSwap();

    }

    void PyramidSort::Run(bool m) {

    int i;

    int tmp;

    // Построение пирамиды

    for (i = this->n/2; i >= 0; i--) {

    if(m)

    this->Screening(i, (this->n - 1));

    else

    this->Screening1(i, (this->n - 1));

    }

    /* Формирование конечной отсортированной

    последовательности + "балансирование"

    пирамиды */

    for (i = this->n - 1; i > 0; i--) {

    // меняем первый с последним

    this->Swap(0, i);

    /* Восстановление баланса

    для пирамиды x[0..i-1] */

    if(m)

    this->Screening(0, i-1);

    else

    this->Screening1(0, i-1);

    }

    }

    PyramidSort::PyramidSort()

    {

    }

    PyramidSort.h

    #pragma once

    #include "Sort.h"

    class PyramidSort :

    public Sort

    {

    public:

    PyramidSort(int, int*);

    void Run(bool);

    void Screening(int, int);

    void Screening1(int, int);

    public:

    PyramidSort(void);

    };

    Insert.cpp

    #include "Insert.h"
    Insert::Insert(int n, int* x) : Sort(n, x)

    {

    this->algName = (char*)"Insert Sort";

    }

    Insert::Insert()

    {

    this->algName = (char*)"Insert Sort";

    }

    void Insert::Run() {

    int t;

    int i, j;

    for (i = 1; i < this->n; i++) {

    t = this->x[i];

    for (j = i; j > 0 && this->x[j-1] > t; j--) {

    this->x[j] = this->x[j-1];

    this->CountSwap();

    }

    this->x[j] = t;

    }

    }

    Insert::Insert()

    {

    }

    Insert.h

    #pragma once

    #include "Sort.h"

    class Insert :

    public Sort

    {

    public:

    Insert(int, int*);

    Insert();

    void Run(void);

    public:

    Insert(void);

    };


    написать администратору сайта