- •Белорусский государственный университет информатики и радиоэлектронники
- •Курсовой проект
- •Содержание.
- •2.1 Описание метода сортировки Пузырьком.
- •2.2 Описание метода сортировки Выбором.
- •2.3 Описание метода сортировки Вставками.
- •2.4 Описание метода Шелла.
- •2.5 Описание Пирамидального метода сортировки.
- •3.1 Алгоритм программы
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


Описание функций.
В программе используются следующие функции:
Функции для работы с обучающей программой:
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 остаемся в программе)
Постусловие: нет.
Руководство пользователю.
Запускаемый файл – kursovay.exe. После его запуска на экране появляется пользовательское меню с курсором на первом пункте со следующими пунктами:
Меню состоит из 6 пунктов:


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

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

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

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

О программе

Выход


Вы действительно хотите
выйти из программы?
Да Нет
«Обучающая программа» - обучающая программа сортировки методом Шелла, вызывается функцией obuchenie();
«Сравнение с n² методами» - графическое сравнение метода Шелла с «пузырьковым» методом, вызывается функцией cravnenie();
«Исследование малый размер» - экспериментальное сравнение пяти методов сортировки массивов малой размерности с выводом результатов в виде таблиц и графиков, вызывается функцией issledovanie();
«Исследование большой размер» - экспериментальное сравнение пяти методов сортировки массивов большой размерности с выводом результатов в виде таблиц и графиков, вызывается функцией issledovaniebig();
«О программе» - краткая информация о разработчике, вызывается функцией oprog();
«Выход» - выход из программы.
Перемещение по меню осуществляется курсорными клавишами. Выбор пункта – клавиша Enter. В любом пункте действия постепенно выполняются (все действия при обучении, исследовании и описании функции сортировки поясняются сносками), затем происходит задержка до нажатия любой клавиши.
Настоятельно рекомендуется читать все пояснения в ходе работы с программой для облегчения восприятия производимых действий.
Программой предусмотрен экстренный выход из пользовательского меню с помощью нажатия клавиши Esc.
Внимание! Клавиша Esc доступна для выхода только из меню. В функциях меню эта кнопка не доступна и чтобы выйти Вам придется проделать до конца реализуемою функцию, а лишь затем из меню выйти или стандартным образом (через пункт «Выход») или через Esc.
Литература.
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
}
