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

3.1 Алгоритм программы

x=1, vixod=0

oformlenie()

ramka()

punkti(x)

vixod

Да ch=13

код Enter

obuchenie()

Нет 1

cravnenie()

2

issledovanie()

3

issledovaniebig()

4

oprog()

5

vixod=vixod(x)

6

oformlenie()

ramka()

punkti(x)

Да ch=’\0’

код расширенный

Нет

72 перемещение вверх

x--

Да

x=6

Нет

punkti(x)

80 перемещение

вниз

x++

Да

x=1

Нет

punkti(x)

Vixod!=1

  1. Описание функций.

В программе используются следующие функции:

Функции для работы с обучающей программой:

  • voidobuchenie() – основная функция обучающей программы;

  • voidramkaforobuch() – функция используется для рисования рамки при оформлении реализации обучающей программы;

Функции для работы с исследованием:

  • voidissledovanie() – функция исследования методов сортировки массивов малой размерности;

  • voidissledovaniebig() – функция исследования методов сортировки массивов большой размерности;

  • long shell(int arr[], int k) – функция сортировки массива методом Шелла;

Вход: intarr[] – массив целых чисел рассчитанный до 2000 элементов,intk– размерность массива.

Предусловие: нет.

Процесс: происходит сортировка массива методом Шелла.

Выход: количество перестановок.

Постусловие: нет.

  • long selectSort (int arr[], int k) – функция сортировки массива методом Выбора;

Вход: intarr[] – массив целых чисел рассчитанный до 2000 элементов,intk– размерность массива.

Предусловие: нет.

Процесс: происходит сортировка массива методом Выбора.

Выход: количество перестановок.

Постусловие: нет.

  • long bubbleSort (int arr[], int k) – функция сортировки массива методом Пузырька;

Вход: intarr[] – массив целых чисел рассчитанный до 2000 элементов,intk– размерность массива.

Предусловие: нет.

Процесс: происходит сортировка массива методом Пузырька.

Выход: количество перестановок.

Постусловие: нет.

  • long heapSort (int arr[], int k) – функция сортировки массива Пирамидальным методом;

Вход: intarr[] – массив целых чисел рассчитанный до 2000 элементов,intk– размерность массива.

Предусловие: нет.

Процесс: происходит сортировка массива Пирамидальным методом.

Выход: количество перестановок.

Постусловие: нет.

  • long insertSort (int arr[], int k) – функция сортировки массива методом Вставки;

Вход: intarr[] – массив целых чисел рассчитанный до 2000 элементов,intk– размерность массива.

Предусловие: нет.

Процесс: происходит сортировка массива методом Вставки.

Выход: количество перестановок.

Постусловие: нет.

Функции для работы с текстом сортировки:

  • voidpokaz() – основная функция демонстрации функции Шелла в программном виде;

  • voidfunkciy(intx) – функция вызывается функциейpokaz() и выводит пояснения к х-ой строчке программы;

Вход: intx– текущая строка функции метода Шелла.

Предусловие: нет.

Процесс: происходит стирания старого пояснения и вывод нового.

Выход: нет.

Постусловие: нет.

Функции для работы со сравнением

  • voidcravnenie() – основная функция пункта сравнения;

Дополнительные функции

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

  • voidoformlenie() – функция оформляет фон в главном меню;

  • voidramka() – функция рисует рамку главного меню;

  • voidpunkti(intx) – функция заполняет пункты главного меню выделяя пункт х (xменяется в пределах от 1 до 6);

  • voidoprog() – функция вывода справки о программе;

  • intvixod() – функция выхода из программы;

Вход: нет.

Предусловие: нет.

Процесс: происходит запрос на выход из программы.

Выход: intvixod– условие выхода (еслиvixod=0 выходим из программы,vixod=1 остаемся в программе)

Постусловие: нет.

  1. Руководство пользователю.

Запускаемый файл – kursovay.exe. После его запуска на экране появляется пользовательское меню с курсором на первом пункте со следующими пунктами:

Меню состоит из 6 пунктов:

Обучающая программа

Сравнение с n² методами

Исследование малый размер

Исследование большой размер

О программе

Выход

Вы действительно хотите

выйти из программы?

Да Нет

«Обучающая программа» - обучающая программа сортировки методом Шелла, вызывается функцией obuchenie();

«Сравнение с n² методами» - графическое сравнение метода Шелла с «пузырьковым» методом, вызывается функцией cravnenie();

«Исследование малый размер» - экспериментальное сравнение пяти методов сортировки массивов малой размерности с выводом результатов в виде таблиц и графиков, вызывается функцией issledovanie();

«Исследование большой размер» - экспериментальное сравнение пяти методов сортировки массивов большой размерности с выводом результатов в виде таблиц и графиков, вызывается функцией issledovaniebig();

«О программе» - краткая информация о разработчике, вызывается функцией oprog();

«Выход» - выход из программы.

Перемещение по меню осуществляется курсорными клавишами. Выбор пункта – клавиша Enter. В любом пункте действия постепенно выполняются (все действия при обучении, исследовании и описании функции сортировки поясняются сносками), затем происходит задержка до нажатия любой клавиши.

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

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

Внимание! Клавиша Esc доступна для выхода только из меню. В функциях меню эта кнопка не доступна и чтобы выйти Вам придется проделать до конца реализуемою функцию, а лишь затем из меню выйти или стандартным образом (через пункт «Выход») или через Esc.

  1. Литература.

1. Шилдт «Теория и практика Си++.»

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

//Автор:

//дата разработки:08.06.2009 г.

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#include <dos.h>

#include <graphics.h>//подключение графической библиотеки

#include <time.h>

class Ofor {

public:

void oformlenie(void);

void ramka(void);

void punkti(int x);

void oprog(void);

void issledovanie1(long kolGr[6][4],long kolGr1[6][4]);

void issledovanie2(long kolGr[6][4],long kolGr1[6][4]);

void issledovaniebig(void);

void issledovanie(void);

void cravnenie(void);

int vixod(void);

void obuchenie(void);

void ramkaforobuch(void);

long shell(int arr[], int k); //сортировка Шелла

void pokaz(void);

void funkciy(int x);

int increment (int inc[], int size);

long selectSort(int a[], int size);//сортировка выбором

long bubbleSort(int a[], int size);//пузырек

long heapSort(int a[], int size); //пирамидальная

void downHeap(int a[], int k, int n, long* s);

long insertSort(int a[], int size);//сортировка вставками

};

void Ofor::oformlenie(void)

{ int x,i,j;

int w;

int mass[25][80]=

{{0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,11,1,0,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0},

{0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0},

{0,1,1,0,0,0,1,1,1,1,0,1,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0},

{0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0},

{0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,2,2,2,2,0,2,2,2,2,0,2,2,2,2,0,2,2,2,2,2,0,2,0,0,0,2,0,2,2,2,2,0,2,2,2,2,0,2,2,2,2,0,2,0,0,2,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,2,0,0,0,0,2,0,0,2,0,2,0,0,2,0,0,0,2,0,0,0,2,0,0,2,2,0,2,0,0,2,0,2,0,0,2,0,2,0,0,2,0,2,0,2,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,2,0,0,0,0,2,0,0,2,0,2,2,2,2,0,0,0,2,0,0,0,2,0,2,0,2,0,2,2,2,2,0,2,0,0,2,0,2,2,2,0,0,2,2,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,2,0,0,0,0,2,0,0,2,0,2,0,0,0,0,0,0,2,0,0,0,2,2,0,0,2,0,2,0,0,0,0,2,0,0,2,0,2,0,0,2,0,2,0,2,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,2,2,2,2,0,2,2,2,2,0,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,2,0,2,0,0,0,0,2,2,2,2,0,2,2,2,2,0,2,0,0,2,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,2,2,2,2,0,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,0,0,2,2,2,2,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,2,2,0,2,0,0,0,0,0,0,2,0,0,0,2,0,0,2,0,0,2,0,2,0,0,2,0,0,2,0,2,2,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,2,2,0,0,0,0,2,0,0,0,2,0,0,2,0,0,2,0,2,0,0,2,0,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,2,0,0,0,0,0,0,2,0,0,0,2,0,0,2,0,2,2,2,2,2,0,2,0,0,2,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,2,2,2,2,0,0,0,2,0,0,0,2,2,2,2,0,2,0,0,0,2,0,2,2,2,2,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,2,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,2,0,0,0,0,0,2,0,0,2,0,0,2,0,0,2,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,2,0,0,0,2,0,0,0,2,0,2,0,0,0,2,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,0,0,0,2,0,0,0,2,0,2,0,0,0,2,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,2,2,2,2,0,2,0,0,0,2,0,2,0,0,0,2,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

textmode(C4350); //задание текстового режима 50х80

for (x=0;x<=4000;x++)

{ textbackground(9);

cprintf("%c",32);

}

gotoxy(1,2);

for(i=0;i<25;i++)

{

for(j=0;j<80;j++)

{ w=mass[i][j];

if(w==0) cprintf(" ");

if(w==1) {textcolor(4); cprintf("%c",219);}

if(w==2) {textcolor(2); cprintf("%c",219);}

}

}

}

void Ofor::ramka(void)

{ int x,y;

textcolor(15);

for(y=22;y<=46;y=y+4)

for(x=5;x<35;x++)

{ gotoxy(x,y);

cprintf("%c",205); }

for(x=5;x<36;x=x+30)

for(y=22;y<46;y++)

{ gotoxy(x,y);

cprintf("%c",186); }

for(y=26;y<44;y=y+4)

{ gotoxy(5,y);

cprintf("%c",204); }

for(y=26;y<44;y=y+4)

{ gotoxy(35,y);

cprintf("%c",185); }

gotoxy(5,22); cprintf("%c",201);

gotoxy(35,22); cprintf("%c",187);

gotoxy(5,46); cprintf("%c",200);

gotoxy(35,46); cprintf("%c",188);

textcolor(4);

gotoxy(40,37); cprintf("%c - peremshenie vverh.",24);

gotoxy(40,39); cprintf("%c - peremeshenie vniz.",25);

gotoxy(40,41); cprintf("Enter - vibor punkta.");

}

/*****************************************************************/

void Ofor::punkti(int x)

{ textcolor(2);

gotoxy(11,24); cprintf("Obuchaushaya programma");

gotoxy(8,28); cprintf("Sravnenie s n%c-mi metodami",253);

gotoxy(8,32); cprintf("Issledovanie malii razmer");

gotoxy(8,36); cprintf("Issledovanie bolshoi razmer");

gotoxy(15,40); cprintf("O programme");

gotoxy(17,44); cprintf(" Vihod");

textcolor(4);

if(x==1) {gotoxy(11,24); cprintf("Obuchaushaya programma");}

if(x==2) {gotoxy(8,28); cprintf("Sravnenie s n%c-mi metodami",253);}

if(x==3) {gotoxy(8,32); cprintf("Issledovanie malii razmer");}

if(x==4) {gotoxy(8,36); cprintf("Issledovanie bolshoi razmer");}

if(x==5) {gotoxy(15,40); cprintf("O programme");}

if(x==6) {gotoxy(17,44); cprintf(" Vihod");}

}

/*****************************************************************/

void Ofor::oprog(void)

{ int x,y;

for(x=17;x<=63;x++)

for(y=15;y<=35;y++)

{ gotoxy(x,y);

textbackground(7);

cprintf("%c",32);

}

textcolor(15);

for(x=18;x<=62;x++)

for(y=15;y<=35;y=y+20)

{ gotoxy(x,y);

cprintf("%c",205);

}

for(y=16;y<=34;y++)

for(x=17;x<=63;x=x+46)

{ gotoxy(x,y);

cprintf("%c",186);

}

gotoxy(17,15); cprintf("%c",201);

gotoxy(63,15); cprintf("%c",187);

gotoxy(17,35); cprintf("%c",200);

gotoxy(63,35); cprintf("%c",188);

textcolor(6);

gotoxy(32,16); cprintf(" O programme.");

textcolor(5);

gotoxy(27,18); cprintf("Dannaya programma yavlyaetsya");

gotoxy(20,19); cprintf(" kursovim proektom po Konstruirovaniu ");

gotoxy(20,20); cprintf(" program i yazikam programirovaniya.");

gotoxy(19,21); cprintf("Tema: <<Metodi sortirovki i ih sravnenie>>.");

gotoxy(19,22); cprintf("Proekt sodergit: obuchaushuu programmu;");

gotoxy(19,23); cprintf(" sravnenie s n%c-mi metodami;",253);

gotoxy(19,24); cprintf(" issledovanie metoda Shella;");

gotoxy(19,26); cprintf("Programmu napisal stydent BSUIR");

gotoxy(19,27); cprintf("fakulteta FZViDO gruppi 701021-30");

textcolor(2);

gotoxy(19,28); cprintf("Satsukevich Alexandr Mihailovich");

textcolor(6);

gotoxy(26,34); cprintf(" Nazhmite lubuu klavishu.");

getch();

}

/******************************************************************/

int Ofor::vixod(void)

{ textmode(C4350); //задание текстового режима 50х80

int x,y,final=1;

char ch;

for(x=25;x<=55;x++)

for(y=20;y<=30;y++)

{ gotoxy(x,y);textbackground(7);cprintf("%c",32);}

textcolor(15);

for(x=26;x<=54;x++)

for(y=20;y<=30;y=y+10)

{gotoxy(x,y);cprintf("%c",205);}

for(y=21;y<=29;y++)

for(x=25;x<=55;x=x+30)

{gotoxy(x,y);cprintf("%c",186);}

gotoxy(25,20); cprintf("%c",201);

gotoxy(55,20); cprintf("%c",187);

gotoxy(25,30); cprintf("%c",200);

gotoxy(55,30); cprintf("%c",188);

textcolor(2);

gotoxy(29,22); cprintf("Vi deistvitelno hotite");

gotoxy(29,23); cprintf(" viiti iz programmi?");

textcolor(4); gotoxy(32,27); cprintf("Da");

textcolor(2); gotoxy(45,27); cprintf("Net");

do

{

ch=getch();

if(ch=='\0') //то код расширенный

{ ch=getch();

switch(int(ch))

{

case 77:{ //перемещение по списку вправо

final++;

if(final==2) final=0;

textcolor(2);

gotoxy(32,27); cprintf("Da");

gotoxy(45,27); cprintf("Net");

textcolor(4);

if(final==1) {gotoxy(32,27); cprintf("Da");}

if(final==0) {gotoxy(45,27); cprintf("Net");}

break;}

case 75:{ //перемещение по списку влево

final--;

if(final==-1) final=1;

textcolor(2);

gotoxy(32,27); cprintf("Da");

gotoxy(45,27); cprintf("Net");

textcolor(4);

if(final==1) {gotoxy(32,27); cprintf("Da");}

if(final==0) {gotoxy(45,27); cprintf("Net");}

break;}

}

}

}while (int(ch)!=13); // код клавиши Esc

return final;

}

/******************************************************************/

void Ofor::issledovanie1(long kolGr[6][4],long kolGr1[6][4])

{ int gdrv=DETECT,gmod=0, i, j,k;

double xe=0,ye=0, xb=0, yb=0;

initgraph(&gdrv,&gmod,"c:\\bgi");

if (graphresult()!=grOk) {printf("Oshibka inicializacii!");getch();}

else

{ setbkcolor(1); //установка цвета фона

setcolor(15);

rectangle(5,5,635,475);

setcolor(4);

line(65,230,65,440); // вертикальная линия

line(65,440,310,440); // горизонтальная линия

line(65,230,55,240); // стрелка вверх

line(65,230,75,240); //

line(310,440,300,430); // стрелка вправо

line(310,440,300,450); //

line(115,438,115,442); line(165,438,165,442);

line(215,438,215,442); line(265,438,265,442);

line(63,390,67,390); line(63,340,67,340);

line(63,290,67,290); line(63,240,67,240);

setcolor(15);

outtextxy(20,390,"2500"); outtextxy(20,340,"5000");

outtextxy(20,290,"7500"); outtextxy(20,240,"10000");

settextstyle(0,0,1);

outtextxy(110,450,"50"); outtextxy(160,450,"100");

outtextxy(210,450,"150"); outtextxy(270,450,"200");

setcolor(4);

outtextxy(20,15," Grafik zavisimosti kolichestva perestanovok ot razmernosti massiva.");

outtextxy(100,465," Nazhmite lubuu klavishu. ");

//график произвольной последовательности

for(i=0;i<5;i++)

{

xb=yb=0;

k=50;

for(j=0;j<4;j++)

{

xe=k; ye=kolGr[i][j]/50;

setcolor(i+2);

line(65+xe,440-ye,65+xb,440-yb);

xb=xe; yb=ye; k+=50;

}

}

//postroenie vtorogo grafika

setcolor(4);

line(365,230,365,440); // вертикальная линия

line(365,440,610,440); // горизонтальная линия

line(365,230,355,240); // стрелка вверх

line(365,230,375,240); //

line(610,440,600,430); // стрелка вправо

line(610,440,600,450); //

line(415,438,415,442); line(465,438,465,442);

line(515,438,515,442); line(565,438,565,442);

line(363,390,367,390); line(363,340,367,340);

line(363,290,367,290); line(363,240,367,240);

setcolor(15);

outtextxy(320,390,"2500"); outtextxy(320,340,"5000");

outtextxy(320,290,"7500"); outtextxy(320,240,"10000");

settextstyle(0,0,1);

outtextxy(410,450,"50"); outtextxy(460,450,"100");

outtextxy(510,450,"150"); outtextxy(570,450,"200");

setcolor(2);

outtextxy(65,460,"Vst");

setcolor(3);

outtextxy(115,460,"Vib");

setcolor(4);

outtextxy(165,460,"Puzir");

setcolor(5);

outtextxy(215,460,"Shell");

setcolor(6);

outtextxy(265,460,"Piramid");

//график произвольной последовательности

for(i=0;i<5;i++)

{

xb=yb=0;

k=50;

for(j=0;j<4;j++)

{

xe=k; ye=kolGr1[i][j]/50;

setcolor(i+2);

line(365+xe,440-ye,365+xb,440-yb);

xb=xe; yb=ye; k+=50;

}

}

getch();

outtextxy(15,25,"1. Sortirovka sluchainogo massiva (levii grafik).");

outtextxy(15,35,"Kak vidno iz tablic i grafikov po skorosti lidiruet piramidalnaya i sortirov-");

outtextxy(15,45,"ka shella. Po kolichestvu perestanovok - menshe vsego ih delaet sortirovka ");

outtextxy(15,55,"viborom. Bolshe vsego - Puzirkovaya i Vstavkami.");

outtextxy(15,65,"T.o. mogno konstatirovat fakt, chto pohozhie po principu algoritmi Viborom");

outtextxy(15,75,"i Vstavkami, pokazivaushie odinakovuu skorost, otlichautsya po koliches- ");

outtextxy(15,85,"tvu perestanovok: pervaya (viborom) - delaet ih menshe chem drugie algoritmi,");

outtextxy(15,95,"vtoraya (vstavkami) - naoborot, bolshe vsego.");

outtextxy(15,115,"2. Sortirovka chastichno otsortirovannogo massiva (pravii grafik).");

outtextxy(15,125,"Po sravneniu c polnostu sluchainimi massivami pri chastichnoi sortirovke");

outtextxy(15,135,"konstatiruem sleduushie fakti: ");

outtextxy(15,145,"1) Sortirovka vstavkami nachinaet operegat sortirovku viborom.");

outtextxy(15,155,"2) Sortirovka Shella nachinaet operegat piramidalnuu po proizvoditelnosti");

outtextxy(15,165,"i kolichestvu perestanovok.");

outtextxy(15,175,"3) Puzirkovaya sortirovka delaet menshe perestanovok chem Vstavkami.");

getch();

}

closegraph();

}

/******************************************************************/

void Ofor::issledovanie(void)

{ int i, j, x,y,arr[200];

double xe,ye, xb, yb;

long n[6][4]={0},n1[6][4]={0};

clock_t start,end;

long double vr[6][4], vr1[6][4];

textmode(C4350); //задание текстового режима 50х80

for (x=0;x<=4000;x++)

{ textbackground(9);

cprintf("%c",32);

}

clrscr();

textcolor(15);

for(y=1;y<=49;y=y+48)

for(x=2;x<=79;x++)

{ gotoxy(x,y);

cprintf("%c",205); }

for(x=1;x<=80;x=x+79)

for(y=2;y<=48;y++)

{ gotoxy(x,y);

cprintf("%c",186); }

gotoxy(1,1); cprintf("%c",201);

gotoxy(80,1); cprintf("%c",187);

gotoxy(1,49); cprintf("%c",200);

gotoxy(80,49); cprintf("%c",188);

textcolor(5);

gotoxy(30,50); cprintf("Nazhmite lubuu klavishu.");

_setcursortype(_NOCURSOR);

textcolor(5);

gotoxy(25,2); cprintf("Issleovanie metodov sortirovki.");

gotoxy(17,3); cprintf("Malaya razmernost sluchaynoy posledovatelnosti.");

gotoxy(10,25); cprintf("Malaya razmernost chastichno otsortirovannoi posledovatelnosti.");

textcolor(15);

getch();

x=2;y=4;

for(i=0;i<7;i++)

{

gotoxy(x,y);cprintf("----------------------------------------------------------------------------");

y+=3;

}

x=2;y=5;

for(j=0;j<6;j++)

{

for(i=0;i<17;i++)

{

gotoxy(x,y);cprintf("|");

y+=1;

}

y=5;

x+=15;

}

gotoxy(3,5);cprintf("Metod");

gotoxy(3,6);cprintf("sortirovki");

gotoxy(18,5);cprintf("______________Kolichestvo perestanovok/vremya______________");

gotoxy(3,8);cprintf("Vstvkami:");

gotoxy(3,11);cprintf("Viborom:");

gotoxy(3,14);cprintf("Puzirek:");

gotoxy(3,17);cprintf("Shella:");

gotoxy(3,20);cprintf("Piromidalnaya:");

//vtoraya tablica

x=2;y=26;

for(i=0;i<7;i++)

{

gotoxy(x,y);cprintf("----------------------------------------------------------------------------");

y+=3;

}

x=2;y=27;

for(j=0;j<6;j++)

{

for(i=0;i<17;i++)

{

gotoxy(x,y);cprintf("|");

y+=1;

}

y=27;

x+=15;

}

gotoxy(3,27);cprintf("Metod");

gotoxy(3,28);cprintf("sortirovki");

gotoxy(18,27);cprintf("______________Kolichestvo perestanovok/vremya______________");

gotoxy(3,30);cprintf("Vstvkami:");

gotoxy(3,33);cprintf("Viborom:");

gotoxy(3,36);cprintf("Puzirek:");

gotoxy(3,39);cprintf("Shella:");

gotoxy(3,42);cprintf("Piromidalnaya:");

x=18;y=6;

getch();

int k=0;

for(j=50;j<=200;j=j+50)

{

randomize();

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[0][k]=insertSort(arr,j);

end=clock();

vr[0][k]=((end-start)/CLOCKS_PER_SEC);

//vr[0]=vr[0]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[1][k]=selectSort(arr,j);

end=clock();

vr[1][k]=((end-start)/CLOCKS_PER_SEC);

//vr[1]=vr[1]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[2][k]=bubbleSort(arr,j);

end=clock();

vr[2][k]=((end-start)/CLOCKS_PER_SEC);

//vr[2]=vr[2]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[3][k]=shell(arr,j);

end=clock();

vr[3][k]=((end-start)/CLOCKS_PER_SEC);

//vr[3]=vr[3]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[4][k]=heapSort(arr,j);

end=clock();

vr[4][k]=((end-start)/CLOCKS_PER_SEC);

//vr[4]=vr[4]*1000000000;

gotoxy(x,y); cprintf("%d",j);

y+=2;

//vivod rezultata v tablicu

for(i=0;i<5;i++)

{

textcolor(5);

gotoxy(x,y); cprintf("%d ",n[i][k]);

y+=1;

textcolor(3);

gotoxy(x,y); cprintf("%lf",vr[i][k]);

y+=2;

}

k++;

y=6;

x+=15;

textcolor(15);

}

//vivod dannih v tablicu 2

x=18;y=28;

getch();

int k1=0;

for(j=50;j<=200;j=j+50)

{

randomize();

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[0][k1]=insertSort(arr,j);

end=clock();

vr1[0][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[0]=vr[0]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[1][k1]=selectSort(arr,j);

end=clock();

vr1[1][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[1]=vr[1]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[2][k1]=bubbleSort(arr,j);

end=clock();

vr1[2][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[2][k]=vr[2][k]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[3][k1]=shell(arr,j);

end=clock();

vr1[3][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[3]=vr[3]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[4][k1]=heapSort(arr,j);

end=clock();

vr1[4][k1]=((end-start)/CLOCKS_PER_SEC);

vr[4][k1]=vr[4][k1]*1000;

gotoxy(x,y); cprintf("%d",j);

y+=2;

//vivod rezultata v tablicu

for(i=0;i<5;i++)

{

textcolor(5);

gotoxy(x,y); cprintf("%lu",n1[i][k1]);

y+=1;

textcolor(3);

gotoxy(x,y); cprintf("%lf",vr1[i][k1]);

y+=2;

}

k1++;

y=28;

x+=15;

textcolor(15);

}

getch();

issledovanie1(n,n1);

}

/************************************************************************/

/**********issledovanie bolshogo*****************************************/

void Ofor::issledovanie2(long kolGr[6][4],long kolGr1[6][4])

{ int gdrv=DETECT,gmod=0, i, j,k;

double xe=0,ye=0, xb=0, yb=0;

initgraph(&gdrv,&gmod,"c:\\bgi");

if (graphresult()!=grOk) {printf("Oshibka inicializacii!");getch();}

else

{

setbkcolor(1); //установка цвета фона

setcolor(15);

rectangle(5,5,635,475);

setcolor(4);

line(65,230,65,440); // вертикальная линия

line(65,440,310,440); // горизонтальная линия

line(65,230,55,240); // стрелка вверх

line(65,230,75,240); //

line(310,440,300,430); // стрелка вправо

line(310,440,300,450); //

line(115,438,115,442); line(165,438,165,442);

line(215,438,215,442); line(265,438,265,442);

line(63,390,67,390); line(63,340,67,340);

line(63,290,67,290); line(63,240,67,240);

setcolor(15);

outtextxy(10,390,"250000"); outtextxy(10,340,"500000");

outtextxy(10,290,"750000"); outtextxy(5,240,"1000000");

settextstyle(0,0,1);

outtextxy(110,450,"500"); outtextxy(160,450,"1000");

outtextxy(210,450,"1500"); outtextxy(270,450,"2000");

setcolor(4);

outtextxy(20,15," Grafik zavisimosti kolichestva perestanovok ot razmernosti massiva.");

//график произвольной последовательности

for(i=0;i<5;i++)

{

xb=yb=0;

k=50;

for(j=0;j<4;j++)

{

xe=k; ye=kolGr[i][j]/5000;

setcolor(i+2);

line(65+xe,440-ye,65+xb,440-yb);

xb=xe; yb=ye; k+=50;

}

}

//postroenie vtorogo grafika

setcolor(4);

line(365,230,365,440); // вертикальная линия

line(365,440,610,440); // горизонтальная линия

line(365,230,355,240); // стрелка вверх

line(365,230,375,240); //

line(610,440,600,430); // стрелка вправо

line(610,440,600,450); //

line(415,438,415,442); line(465,438,465,442);

line(515,438,515,442); line(565,438,565,442);

line(363,390,367,390); line(363,340,367,340);

line(363,290,367,290); line(363,240,367,240);

setcolor(15);

outtextxy(310,390,"250000"); outtextxy(310,340,"500000");

outtextxy(310,290,"750000"); outtextxy(305,240,"1000000");

settextstyle(0,0,1);

outtextxy(410,450,"500"); outtextxy(460,450,"1000");

outtextxy(510,450,"1500"); outtextxy(570,450,"2000");

setcolor(4);

outtextxy(100,465," Nazhmite lubuu klavishu. ");

//график произвольной последовательности

setcolor(2);

outtextxy(65,460,"Vst");

setcolor(3);

outtextxy(115,460,"Vib");

setcolor(4);

outtextxy(165,460,"Puzir");

setcolor(5);

outtextxy(215,460,"Shell");

setcolor(6);

outtextxy(265,460,"Piramid");

for(i=0;i<5;i++)

{

xb=yb=0;

k=50;

for(j=0;j<4;j++)

{

xe=k; ye=kolGr1[i][j]/5000;

setcolor(i+2);

line(365+xe,440-ye,365+xb,440-yb);

xb=xe; yb=ye; k+=50;

}

}

getch();

outtextxy(15,25,"1. Sortirovka sluchainogo massiva (levii grafik).");

outtextxy(15,35,"Po sravneniu so sluchainimi massivami na malih razmernostyah v sluchae bol-");

outtextxy(15,45,"shih konstatiruem sleduushie fakti:");

outtextxy(15,55,"1) Izmenenii net.");

outtextxy(15,75,"2. Sortirovka chastichno otsortirovannogo massiva (pravii grafik).");

outtextxy(15,85,"Po sravneniu c malimi razmernostyami chastichno otsortirovannih massivov");

outtextxy(15,95,"konstatiruem sleduushie fakti: ");

outtextxy(15,105,"1) Sortirovka viborom perestaet lidirovat nad vstavkami, oni nachinaut poka-.");

outtextxy(15,115,"zivat primerno odinakovou proizvoditelnost.");

outtextxy(15,125,"2) Piramidalnaya teper uzhe operezhaet Shella na vseh znacheniyah.");

getch();

}

closegraph();

}

/******************************************************************/

void Ofor::issledovaniebig(void)

{ int i, j, x,y,arr[2000];

double xe,ye, xb, yb;

long n[6][4]={0},n1[6][4]={0};

clock_t start,end;

float vr[6][4],vr1[6][4];

textmode(C4350); //задание текстового режима 50х80

for (x=0;x<=4000;x++)

{ textbackground(9);

cprintf("%c",32);

}

clrscr();

textcolor(15);

for(y=1;y<=49;y=y+48)

for(x=2;x<=79;x++)

{ gotoxy(x,y);

cprintf("%c",205); }

for(x=1;x<=80;x=x+79)

for(y=2;y<=48;y++)

{ gotoxy(x,y);

cprintf("%c",186); }

gotoxy(1,1); cprintf("%c",201);

gotoxy(80,1); cprintf("%c",187);

gotoxy(1,49); cprintf("%c",200);

gotoxy(80,49); cprintf("%c",188);

textcolor(5);

gotoxy(30,50); cprintf("Nazhmite lubuu klavishu.");

_setcursortype(_NOCURSOR);

textcolor(5);

gotoxy(25,2); cprintf("Issleovanie metodov sortirovki.");

gotoxy(17,3); cprintf("Bolshaya razmernost sluchaynoy posledovatelnosti.");

gotoxy(10,25); cprintf("Bolshaya razmernost chastichno otsortirovannoi posledovatelnosti.");

textcolor(15);

getch();

x=2;y=4;

for(i=0;i<7;i++)

{

gotoxy(x,y);cprintf("----------------------------------------------------------------------------");

y+=3;

}

x=2;y=5;

for(j=0;j<6;j++)

{

for(i=0;i<17;i++)

{

gotoxy(x,y);cprintf("|");

y+=1;

}

y=5;

x+=15;

}

gotoxy(3,5);cprintf("Metod");

gotoxy(3,6);cprintf("sortirovki");

gotoxy(18,5);cprintf("______________Kolichestvo perestanovok/vremya______________");

gotoxy(3,8);cprintf("Vstvkami:");

gotoxy(3,11);cprintf("Viborom:");

gotoxy(3,14);cprintf("Puzirek:");

gotoxy(3,17);cprintf("Shella:");

gotoxy(3,20);cprintf("Piromidalnaya:");

//vtoraya tablica

x=2;y=26;

for(i=0;i<7;i++)

{

gotoxy(x,y);cprintf("----------------------------------------------------------------------------");

y+=3;

}

x=2;y=27;

for(j=0;j<6;j++)

{

for(i=0;i<17;i++)

{

gotoxy(x,y);cprintf("|");

y+=1;

}

y=27;

x+=15;

}

gotoxy(3,27);cprintf("Metod");

gotoxy(3,28);cprintf("sortirovki");

gotoxy(18,27);cprintf("______________Kolichestvo perestanovok/vremya______________");

gotoxy(3,30);cprintf("Vstvkami:");

gotoxy(3,33);cprintf("Viborom:");

gotoxy(3,36);cprintf("Puzirek:");

gotoxy(3,39);cprintf("Shella:");

gotoxy(3,42);cprintf("Piromidalnaya:");

//vivod dannih v tablicu 1

x=18;y=6;

getch();

int k=0;

for(j=500;j<=2000;j=j+500)

{

randomize();

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[0][k]=insertSort(arr,j);

end=clock();

vr[0][k]=((end-start)/CLOCKS_PER_SEC);

//vr[0]=vr[0]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[1][k]=selectSort(arr,j);

end=clock();

vr[1][k]=((end-start)/CLOCKS_PER_SEC);

//vr[1]=vr[1]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[2][k]=bubbleSort(arr,j);

end=clock();

vr[2][k]=((end-start)/CLOCKS_PER_SEC);

//vr[2][k]=vr[2][k]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[3][k]=shell(arr,j);

end=clock();

vr[3][k]=((end-start)/CLOCKS_PER_SEC);

//vr[3]=vr[3]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

start=clock();

n[4][k]=heapSort(arr,j);

end=clock();

vr[4][k]=((end-start)/CLOCKS_PER_SEC);

//vr[4]=vr[4]*1000000000;

gotoxy(x,y); cprintf("%d",j);

y+=2;

//vivod rezultata v tablicu

for(i=0;i<5;i++)

{

textcolor(5);

gotoxy(x,y); cprintf("%lu",n[i][k]);

y+=1;

textcolor(3);

gotoxy(x,y); cprintf("%f",vr[i][k]);

y+=2;

}

k++;

y=6;

x+=15;

textcolor(15);

}

//vivod dannih v tablicu 2

x=18;y=28;

getch();

int k1=0;

for(j=500;j<=2000;j=j+500)

{

randomize();

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[0][k1]=insertSort(arr,j);

end=clock();

vr1[0][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[0]=vr[0]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[1][k1]=selectSort(arr,j);

end=clock();

vr1[1][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[1]=vr[1]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[2][k1]=bubbleSort(arr,j);

end=clock();

vr1[2][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[2][k]=vr[2][k]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[3][k1]=shell(arr,j);

end=clock();

vr1[3][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[3]=vr[3]*1000000000;

for(i=0;i<j;i++) arr[i]=random(100);

insertSort(arr,j/2);

start=clock();

n1[4][k1]=heapSort(arr,j);

end=clock();

vr1[4][k1]=((end-start)/CLOCKS_PER_SEC);

//vr[4]=vr[4]*1000000000;

gotoxy(x,y); cprintf("%d",j);

y+=2;

//vivod rezultata v tablicu

for(i=0;i<5;i++)

{

textcolor(5);

gotoxy(x,y); cprintf("%lu",n1[i][k1]);

y+=1;

textcolor(3);

gotoxy(x,y); cprintf("%f",vr1[i][k1]);

y+=2;

}

k1++;

y=28;

x+=15;

textcolor(15);

}

getch();

issledovanie2(n,n1);

textmode(C4350); //задание текстового режима 50х80

for (x=0;x<=4000;x++)

{ textbackground(9);

cprintf("%c",32);

}

clrscr();

textcolor(15);

for(y=1;y<=49;y=y+48)

for(x=2;x<=79;x++)

{ gotoxy(x,y);

cprintf("%c",205); }

for(x=1;x<=80;x=x+79)

for(y=2;y<=48;y++)

{ gotoxy(x,y);

cprintf("%c",186); }

gotoxy(1,1); cprintf("%c",201);

gotoxy(80,1); cprintf("%c",187);

gotoxy(1,49); cprintf("%c",200);

gotoxy(80,49); cprintf("%c",188);

textcolor(4);

gotoxy(30,3); cprintf("VIVODI:");

gotoxy(2,5); cprintf("1.Sortirovka Viborom po proizvoditelnosti v obshem malo otlichaetsya ot");

gotoxy(2,6); cprintf("Vstavkami, no vot po kolichestvu perestanovok - lidiruet vo vseh testah.");

gotoxy(2,8); cprintf("2.Piramidalnaya sortirovka i sortirovka Shella: pokazali primerno odinakovie");

gotoxy(2,9); cprintf("rezultati, imeut nailuchsheu proizvoditelnost.");

gotoxy(2,11); cprintf("3.Vstavkami i Puzirkovaya: pokazali primerno odinakovie rezultati po koliches-");

gotoxy(2,12); cprintf("tvu perestanovok, odnako po proizvoditelnosti lidiruet sortirovka Vstavkami.");

getch();

}

/************************************************************************/

void Ofor::obuchenie(void)

{ int x, x2, y, y2, k=10, arr[10], buf;

textmode(C4350); //задание текстового режима 50х80

for (x=0;x<=4000;x++)

{ textbackground(9);

cprintf("%c",32);

}

textcolor(15);

for(y=1;y<=49;y=y+48)

for(x=2;x<=79;x++)

{ gotoxy(x,y);

cprintf("%c",205); }

for(x=1;x<=80;x=x+79)

for(y=2;y<=48;y++)

{ gotoxy(x,y);

cprintf("%c",186); }

for(y=2;y<=48;y++)

{ gotoxy(48,y);

cprintf("%c",186); }

gotoxy(1,1); cprintf("%c",201);

gotoxy(80,1); cprintf("%c",187);

gotoxy(1,49); cprintf("%c",200);

gotoxy(80,49); cprintf("%c",188);

gotoxy(48,1); cprintf("%c",203);

gotoxy(48,49); cprintf("%c",202);

textcolor(5);

gotoxy(30,50); cprintf("Nazhmite lubuu klavishu.");

// ramkaforobuch();

_setcursortype(_NOCURSOR);

textcolor(5);

gotoxy(12,3); cprintf("Sortirovka metodom Shella.");

textcolor(15);

gotoxy(4,5); cprintf("Etot metod nazvan po imeni ego izobritatelya");

gotoxy(3,6); cprintf("(D.L.Shell). On postroen na osnove s mini-");

gotoxy(3,7); cprintf("mizaciei promezhutochnih shagov.");

gotoxy(3,8); cprintf(" Rassmotrim metod Shella na konkretnom ");

gotoxy(3,9); cprintf("primere. Vozmem massiv sostoyashii iz %d",k);

gotoxy(3,10); cprintf("elementov i zapolnim ego sluchainimi celimi");

gotoxy(3,11); cprintf("chislami v intervale ot 1 do 99.");

getch();

ramkaforobuch();

randomize(); //инициализатор случайных чисел

for(x=0;x<10;x++)

{ arr[x]=random(98)+1;} //заполнение массива случайнами числами

_setcursortype(_NOCURSOR);

gotoxy(50,5);

for(x=0;x<10;x++)

{ printf("%d ",arr[x]);

if(arr[x]<10) printf(" ");

}

textcolor(15);

//первый круг

gotoxy(3,3); cprintf(" Ishodnii massiv predstavlen v pravom okne");

gotoxy(3,4); cprintf("ekrana.");

gotoxy(3,5); cprintf(" Po Metodu Shella snachalo vipolnyaetsya");

gotoxy(3,6); cprintf("sortirovka elementov, otstoushih drug ot");

gotoxy(3,7); cprintf("druga na devyat pozicii: ");

y=7; y2=6;

for(x=0;x<1;x++)

{ textcolor(15);

gotoxy(50,y2-1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

textcolor(5);

gotoxy(50+3*x,y2-1); cprintf("%d",arr[x]);

gotoxy(50+3*x+27,y2-1); cprintf("%d",arr[x+9]);

gotoxy(50+3*x,y2);

cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217);

y++; textcolor(15); gotoxy(6,y); cprintf("Sravnivaem %d и %d.",arr[x],arr[x+9]);

y++; gotoxy(10,y);

if(arr[x]<=arr[x+9]) cprintf(" т.к. %d <= %d ostavlyaem kak est.",arr[x],arr[x+9]);

if(arr[x]>arr[x+9])

{ cprintf(" t.k. %d > %d menyaem ih mestami.",arr[x],arr[x+9]);

y2=y2+2;

buf=arr[x];

arr[x]=arr[x+9];

arr[x+9]=buf;

}

getch();

gotoxy(50+3*x,y2);

printf(" ");

}

textcolor(15);

gotoxy(50,y2+1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

gotoxy(3,y+1); cprintf(" Mi poluchili massiv posle pervogo");

gotoxy(3,y+2); cprintf("kruga sortirovki.");

getch();

//второй круг

ramkaforobuch();

textcolor(15);

gotoxy(3,3); cprintf(" Po metodu Shella dalle vipolnyaetsya");

gotoxy(3,4); cprintf("sortirovka elementov, otstaushih drug ot");

gotoxy(3,5); cprintf("druga na pyat pozicii: ");

y=5; y2=6;

for(x=0;x<5;x++)

{ textcolor(15);

gotoxy(50,y2-1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

textcolor(5);

gotoxy(50+3*x,y2-1); cprintf("%d",arr[x]);

gotoxy(50+3*x+15,y2-1); cprintf("%d",arr[x+5]);

gotoxy(50+3*x,y2);

cprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217);

y++; textcolor(15); gotoxy(6,y); cprintf("Sravnivaem %d и %d.",arr[x],arr[x+5]);

y++; gotoxy(10,y);

if(arr[x]<=arr[x+5]) cprintf(" т.к. %d <= %d ostavlyaem kak est.",arr[x],arr[x+5]);

if(arr[x]>arr[x+5])

{ cprintf(" т.к. %d > %d menyaem ih mestami.",arr[x],arr[x+5]);

y2=y2+2;

buf=arr[x];

arr[x]=arr[x+5];

arr[x+5]=buf;

}

getch();

gotoxy(50+3*x,y2);

printf(" ");

}

textcolor(15);

gotoxy(50,y2+1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

gotoxy(3,y+1); cprintf(" Mi poluchili massiv posle vtorogo");

gotoxy(3,y+2); cprintf("kruga sortirovki.");

getch();

//третьего круг

ramkaforobuch();

textcolor(15);

gotoxy(3,3); cprintf(" Proizvedem sortirovku elementov");

gotoxy(3,4); cprintf("otstaushih drug ot druga na tri pozicii: ");

y=4; y2=6;

for(x=0;x<7;x++)

{ textcolor(15);

gotoxy(50,y2-1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

textcolor(5);

gotoxy(50+3*x,y2-1); cprintf("%d",arr[x]);

gotoxy(50+3*x+9,y2-1); cprintf("%d",arr[x+3]);

gotoxy(50+3*x,y2);

cprintf("%c%c%c%c%c%c%c%c%c%c",192,196,196,196,196,196,196,196,196,217);

y++; textcolor(15); gotoxy(6,y); cprintf("Sravnivaem %d и %d.",arr[x],arr[x+3]);

y++; gotoxy(10,y);

if(arr[x]<=arr[x+3]) cprintf(" т.к. %d <= %d ostavlyaem kak est.",arr[x],arr[x+3]);

if(arr[x]>arr[x+3])

{ cprintf(" т.к. %d > %d menyaem ih mestami.",arr[x],arr[x+3]);

y2=y2+2;

buf=arr[x];

arr[x]=arr[x+3];

arr[x+3]=buf;

}

getch();

gotoxy(50+3*x,y2);

printf(" ");

}

textcolor(15);

gotoxy(50,y2+1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

gotoxy(3,y+1); cprintf(" Mi poluchili massiv posle tretego");

gotoxy(3,y+2); cprintf("kruga sortirovki.");

getch();

//сортировка по четвертому кругу

ramkaforobuch();

gotoxy(50,5);

for(x=0;x<10;x++)

{ printf("%d ",arr[x]);

if(arr[x]<10) printf(" ");

}

textcolor(15);

gotoxy(3,3); cprintf(" Dalee mi budem sortirovat elementi,");

gotoxy(3,4); cprintf("otstaushie drug ot druga na dve pozicii:");

y=4; y2=6;

for(x=0;x<8;x++)

{ textcolor(15);

gotoxy(50,y2-1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

textcolor(5);

gotoxy(50+3*x,y2-1); cprintf("%d",arr[x]);

gotoxy(50+3*x+6,y2-1); cprintf("%d",arr[x+2]);

gotoxy(50+3*x,y2);

cprintf("%c%c%c%c%c%c%c",192,196,196,196,196,196,217);

y++; textcolor(15); gotoxy(6,y); cprintf("Sravnivaem %d и %d.",arr[x],arr[x+2]);

y++; gotoxy(10,y);

if(arr[x]<=arr[x+2]) cprintf(" т.к. %d <= %d ostavlyaem kak est.",arr[x],arr[x+2]);

if(arr[x]>arr[x+2])

{ cprintf(" т.к. %d > %d menyaem ih mestami.",arr[x],arr[x+2]);

y2=y2+2;

buf=arr[x];

arr[x]=arr[x+2];

arr[x+2]=buf;

}

getch();

gotoxy(50+3*x,y2);

printf(" ");

}

textcolor(15);

gotoxy(50,y2+1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

gotoxy(3,y+1); cprintf(" Mi poluchili massiv posle chetvertogo");

gotoxy(3,y+2); cprintf("kruga sortirovki.");

getch();

//сортировка по пятому кругу

ramkaforobuch();

gotoxy(50,5);

for(x=0;x<10;x++)

{ printf("%d ",arr[x]);

if(arr[x]<10) printf(" ");

}

textcolor(15);

gotoxy(3,3); cprintf(" Nakonec, mi budem sortirovat smezhnie");

gotoxy(3,4); cprintf("elementi:");

y=4; y2=6;

for(x=0;x<9;x++)

{ textcolor(15);

gotoxy(50,y2-1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

textcolor(5);

gotoxy(50+3*x,y2-1); cprintf("%d",arr[x]);

gotoxy(50+3*x+3,y2-1); cprintf("%d",arr[x+1]);

gotoxy(50+3*x,y2);

cprintf("%c%c%c",192,196,217);

y++; textcolor(15); gotoxy(6,y); cprintf("Sravnivaem %d и %d.",arr[x],arr[x+1]);

y++; gotoxy(10,y);

if(arr[x]<=arr[x+1]) cprintf(" t.k. %d <= %d ostavlyaem kak est.",arr[x],arr[x+1]);

if(arr[x]>arr[x+1])

{ cprintf(" т.к. %d > %d meniyaem ih mestami.",arr[x],arr[x+1]);

y2=y2+2;

buf=arr[x];

arr[x]=arr[x+1];

arr[x+1]=buf;

}

getch();

gotoxy(50+3*x,y2);

printf(" ");

}

textcolor(15);

gotoxy(50,y2+1);

for(x2=0;x2<10;x2++)

{ cprintf("%d ",arr[x2]);

if(arr[x2]<10) cprintf(" ");

}

gotoxy(3,y+1); cprintf(" Mi poluchili massiv posle pyatogo");

gotoxy(3,y+2); cprintf("kruga sortirovki.");

getch();

ramkaforobuch();

textcolor(15);

gotoxy(3,3); cprintf(" Takim obrazom Vi seichas samostoiyatelno");

gotoxy(3,4); cprintf("pronabludali sortirovku massiva metodom");

gotoxy(3,5); cprintf("Shella. Pervii vzglyad na etot algoritm ne");

gotoxy(3,6); cprintf("daet ponimaniya togo, pochemu etot kazhushii- ");

gotoxy(3,7); cprintf("sya stol slozhnim metod daet stol horoshie ");

gotoxy(3,8); cprintf("rezultati. Neponyatno dazhe, kak on voobshe ");

gotoxy(3,9); cprintf("sortiruet massiv. Odnako, metod rabotaet. ");

gotoxy(3,10); cprintf("Kazhdii promezhutochnii shag zadeistvuet otno-");

gotoxy(3,11); cprintf("sitelno neblshoe kolichestvo elementov, ");

gotoxy(3,12); cprintf("kotorie k tomu zhe mogut uzhe nahoditsya v ");

gotoxy(3,13); cprintf("nuzhnom poryadke. Poetomu metod Shella effekti- ");

gotoxy(3,14); cprintf("ven, i uporyadochennost massiva vozrastaet ");

gotoxy(3,15); cprintf("posle kazhdogo prohoda.");

gotoxy(3,16); cprintf(" Horosho sebya zarekomendovala posledovatel-");

gotoxy(3,17); cprintf("nost 9, 5, 3, 2, 1, kotoraya ispolzovana v ");

gotoxy(3,18); cprintf("visheprevedennom primere realizacii algoritma");

gotoxy(3,19); cprintf("Shella. Izbegaite posledovatelnost stepenei");

gotoxy(3,20); cprintf("2, poskolku matematicheski strogo dokazano,");

gotoxy(3,21); cprintf("chto eto snizhaet effektivnost algoritma ");

gotoxy(3,22); cprintf("(kotorii,tem ne menee, rabotaet i v etom ");

gotoxy(3,23); cprintf("sluchae). ");

getch();

}

/******************************************************************/

void Ofor::cravnenie(void)

{ float x,y;

int gdrv=DETECT,gmod=0;

initgraph(&gdrv,&gmod,"c:\\bgi");

if (graphresult()!=grOk) {printf("Oshibka inicializacii!");getch();}

else

{

setbkcolor(1); //установкак цвета фона

setcolor(15);

rectangle(5,5,635,475);

rectangle(7,7,360,473);

rectangle(362,7,632,473);

setcolor(4);

line(400,50,400,300);

line(400,300,600,300);

line(400,50,390,60);

line(400,50,410,60);

line(600,300,590,290);

line(600,300,590,310);

x=0;

for(x=0;x<160;x=x+0.01)

{ y=x*x*0.01;

putpixel(x+400,300-y,2);

}

x=0;

for(x=0;x<160;x=x+0.01)

{ y=pow(x,1.2)*0.1;

putpixel(x+400,300-y,5);

}

setcolor(15);

outtextxy(460,310," n ----> ");

settextstyle(0,1,1);

outtextxy(390,100," Vremya vipolneniya ----> ");

settextstyle(0,0,1);

setcolor(2); line(410,330,440,330);

setcolor(15); outtextxy(445,327," = ocenka vremeni");

outtextxy(445,335," sortirovki");

outtextxy(445,343," puzirkovogo metoda.");

setcolor(5); line(410,360,440,360);

setcolor(15); outtextxy(445,357," = ocenka vremeni");

outtextxy(445,365," sortirovki");

outtextxy(445,373," metodom Shella.");

setcolor(4);

outtextxy(90,30," Sravnenie metoda Shella");

outtextxy(90,40,"s n-kvadratnimi metodami.");

outtextxy(90,450,"Nazhmite lubuu klavishu.");

setcolor(15);

outtextxy(20,60," Glavnoe sravnenie lubih metodov");

outtextxy(20,70,"sortirovki sostoit v sravnenii vremeni");

outtextxy(20,80,"ih realizacii.");

outtextxy(20,90," Na risunke privedeni grafiki");

outtextxy(20,100,"zavisimosti vremeni vipolneniya sorti-");

outtextxy(20,110,"rovki ot kolichestva chlenov v massive");

outtextxy(20,120,"dlya ''puzirkovogo'' metoda i dlya ");

outtextxy(20,130,"metoda Shella. Uzhe iz grafikov vidno");

outtextxy(20,140,"progress v realizacii metoda Shella");

outtextxy(20,150,"po sravneniu s ''puzirkovim''");

outtextxy(20,160,"metodom.");

outtextxy(20,170," Voobshe, vremya vipolneniya sortirovki");

outtextxy(20,180,"proporcionalno kolichestvu sravnenii");

outtextxy(20,190,"plus kolichestvo prisvaivanii elementov");

outtextxy(20,200,"massiva v hode vipolneniya processa");

outtextxy(20,210,"sortirovki.");

outtextxy(20,220," Takim obrazom, primerno bilo ");

outtextxy(20,230,"podschitano, chto vremya sortirovki");

outtextxy(20,240,"massiva ''puzirkovim'' metodom");

outtextxy(20,250,"proporcionalno kvadratu kolichestva");

outtextxy(20,260,"chlenov massiva. Tak zhe bilo podschitano,");

outtextxy(20,270,"chto vremya sortirovki massiva metodom");

outtextxy(20,280,"Shella proporcionalno kolichestvu chlenov");

outtextxy(20,290,"massiva v stepeni 1.2. Eto sushestvennii");

outtextxy(20,300,"progress po sravneniu s n-kvadratnimi");

outtextxy(20,310,"metodami sortirovki.");

outtextxy(20,320," Metod Shella yavlyaetsya usovershenst-");

outtextxy(20,330,"vovannimmetodom sortirovki.");

getch();

}

closegraph();

}

/***********************************************************/

void Ofor::ramkaforobuch(void)

{ int x, y;

for (x=2;x<47;x++)

for(y=2;y<48;y++)

{ gotoxy(x,y);

textbackground(9);

cprintf("%c",32); }

for (x=49;x<79;x++)

for(y=2;y<48;y++)

{ gotoxy(x,y);

textbackground(9);

cprintf("%c",32); }

textcolor(5);

gotoxy(30,50); cprintf("Nazhmite lubuu klavishu.");

}

/*****************************************************/

int Ofor::increment (int inc[], int size)

{

int p1,p2,p3,s;

p1=p2=p3=1;

s=-1;

do{

if(++s%2){

inc[s]=8*p1-6*p2+1;

}

else {

inc[s]=9*p1-9*p3+1;

p2*=2;

p3*=2;

}

p1*=2;

} while(3*inc[s]<size);

return s>0 ? --s : 0;

}

long Ofor::shell(int arr[], int size)

{

long n=0;

int inc,i,j,seq[40];

int s;

s=increment(seq,size);

while (s>=0)

{

inc=seq[s--];

for(i=0;i<size; i++)

{

int temp=arr[i];

for(j=i-inc; ((j>=0)&&(arr[j]>temp));j-=inc)

{

arr[j+inc]=arr[j];

n++;//podschet kolichestva perestanovok

}

arr[j+inc]=temp;

n++;

}

}

return n;

}

/*******************************************************/

/**********************************************************/

long Ofor::selectSort(int a[], int size) {

long i, j, k;

int x;

for( i=0; i < size; i++) { // i - номер текущего шага

k=i; x=a[i];

for( j=i+1; j < size; j++) // цикл выбора наименьшего элемента

if ( a[j] < x ) {

k=j; x=a[j]; // k - индекс наименьшего элемента

}

a[k] = a[i]; a[i] = x; // меняем местами наименьший с a[i]

}

return i-1;

}

/************************************************************/

/**********************************************************/

long Ofor::bubbleSort(int a[], int size) {

long i, j, n=0;

int x;

for( i=0; i < size; i++) { // i - номер прохода

for( j = size-1; j > i; j-- ) { // внутренний цикл прохода

if ( a[j-1] > a[j] ) {

x=a[j-1]; a[j-1]=a[j]; a[j]=x; n++;

}

}

}

return n;

}

/************************************************************/

void Ofor::downHeap(int a[], int k, int i, long *n) {

// процедура просеивания следующего элемента

// До процедуры: a[k+1]...a[n] - пирамида

// После: a[k]...a[n] - пирамида

int new_elem;

int child;

new_elem = a[k];

while(k <= i/2) { // пока у a[k] есть дети

child = 2*k;

// выбираем большего сына

if( child < i && a[child] < a[child+1] )

child++;

if( new_elem >= a[child] ) break;

// иначе

a[k] = a[child]; // переносим сына наверх

k = child; *n=*n+1;

}

a[k] = new_elem; *n=*n+1;

}

long Ofor::heapSort(int a[], int size) {

long i,n=0;

int temp;

// строим пирамиду

for(i=size/2-1; i >= 0; i--) downHeap(a, i, size-1,&n);

// теперь a[0]...a[size-1] пирамида

for(i=size-1; i > 0; i--) {

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

temp=a[i]; a[i]=a[0]; a[0]=temp; n++;

// восстанавливаем пирамидальность a[0]...a[i-1]

downHeap(a, 0, i-1, &n);

}

return n;

}

/************************************************************/

long Ofor::insertSort(int a[], int size) {

long x, n=0;

int i, j;

for ( i=0; i < size; i++) { // цикл проходов, i - номер прохода

x = a[i];

// поиск места элемента в готовой последовательности

for ( j=i-1; j>=0 && a[j] > x; j--)

{

a[j+1] = a[j];

n++; // сдвигаем элемент направо, пока не дошли

}

// место найдено, вставить элемент

a[j+1] = x;

}

return n;

}

/************************************************************/

void main(void)

{ int x=1, vixod=0;

char ch;

Ofor of;

clrscr();

of.oformlenie();

of.ramka();

of.punkti(x);

_setcursortype(_NOCURSOR);

do {

ch=getch();

if(ch==13) { //запуск пункта

switch(int(x))

{ case 6: {vixod=of.vixod();

break;}

case 5: {of.oprog();

break;}

case 4: {of.issledovaniebig();

break;}

case 3: {of.issledovanie();

break;}

case 2: {of.cravnenie();

break;}

case 1: {of.obuchenie();

break;}

}

clrscr();

of.oformlenie();

of.ramka();

of.punkti(x);

_setcursortype(_NOCURSOR);

}

if(ch=='\0') //то код расширенный

{ ch=getch();

switch(int(ch))

{ case 72:{ //перемещение по списку вверх

x--;

if(x==0) x=6;

of.punkti(x);

_setcursortype(_NOCURSOR);

break;}

case 80:{ //перемещение по списку вниз

x++;

if(x==7) x=1;

of.punkti(x);

_setcursortype(_NOCURSOR);

break;}

}

}

}while (int(ch)!=27 && vixod!=1); // код клавиши Esc

}