#include <iostream>
#include <time.h>
#include <limits>
using namespace std;
//Сортировка метородом выборки
int SortSelection(int* Arr, int CountEl)
{
int Iter = 0;
int* ptr = Arr;
cout<<endl;
while (ptr != (Arr+CountEl))
{
int Max = std::numeric_limits<int>::max();
int* ptr2 = ptr;
int* ptrCurrent = ptr2;
while (ptr2 != (Arr+CountEl))
{
if (Max > *ptr2)
{
Max = *ptr2;
ptrCurrent = ptr2;
}
ptr2++;
Iter++;
}
*ptrCurrent = *ptr;
*ptr = Max;
ptr++;
}
return Iter;
}
//Сортировка методом кучи (Пирамидальным деревом)
int SortHeap(int* Arr, int CountEl)
{
int dl =0;
int Iter = 0;
while(dl+2 != CountEl)
{
bool isIter = false;
for (int i=0; i<(CountEl-dl)/2;i++)
{
if (Arr[i] < Arr[2*i])
{
int temp = Arr[2*i];
Arr[2*i] = Arr[i];
Arr[i] = temp;
isIter = true;
}
if (Arr[i]< Arr[2*i+1])
{
int temp = Arr[2*i+1];
Arr[2*i+1] = Arr[i];
Arr[i] = temp;
isIter = true;
}
}
if (!isIter)
{
int temp = Arr[0];
Arr[0] = Arr[CountEl-1-dl];
Arr[CountEl-1-dl] = temp;
dl++;
}
Iter++;
}
return Iter;
}
//Функция вывода массива
void PrintArr(int* Arr, int CountEl)
{
int *ptr = Arr;
while (ptr != (Arr+CountEl))
{
cout<<*ptr<<" ";
ptr++;
}
cout<<endl;
}
//Главная функция
void main (void)
{
int *Arr;
int *ptr;
int CountEl = 0;
setlocale(LC_ALL,"Russian");
srand(time(NULL));
cout<<"Введите кол-во элементов в последовательности: ";
cin>>CountEl;
Arr = new int[CountEl];
ptr = Arr;
//Формирование массива
while (ptr != (Arr+CountEl))
{
*ptr = rand()%100 * (rand()%2?1:-1);
ptr++;
}
cout<<endl<<"Сформированный список элементов : "<<endl;
PrintArr(Arr, CountEl);
cout<<endl<<"1. Сортировка выборкой (Selection Sort)"<<
endl<<"2. Сортировка методом кучи (Heap Sort)"<<endl
<<endl<<"Выбор : ";
int UseSort;
cin>>UseSort;
switch (UseSort)
{
case 1 : cout<<endl<<"Сортировка выполнена за "<<SortSelection(Arr, CountEl)<<" итетаций"<<endl; break;
case 2 : cout<<endl<<"Сортировка выполнена за "<<SortHeap(Arr, CountEl)<<" итетаций"<<endl; break;
default: cout<<endl<<" Метод сортировки не выбран ."<<endl;
}
cout<<"Отсортированный массив :"<<endl;
PrintArr(Arr, CountEl);
}