Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C++ / ClassSort

.cpp
Скачиваний:
15
Добавлен:
27.03.2015
Размер:
3.46 Кб
Скачать
#include "Cl_Random.h"
#include "ClassSort.h"

void SORT :: InitMas(unsigned int *_Mas, unsigned int _N)
{
      ErrorCode=0;
      if(_Mas == NULL || !_N){ErrorCode = 3; return;}
      Mas = _Mas;
      N = _N;
}

short int SORT :: GetErrorCode(void){return ErrorCode;}

void SORT :: ShowMsg()
{
   switch(ErrorCode){
     case 1:
       printf("\n Ошибка захвата памяти под массив генеральной совокупности");
       break;
     case 2:
       printf("\n Ошибка захвата памяти под массив выборки из N элементов");
       break;
     case 3:
       printf("\n Ошибка задания входного параметра, либо память под массивы не захвачена");
       break;
     case 4:
       printf("\n Не определен массив данных для модуля bubble");
       break;
     case 5:
       printf("\n Ошибка сортировки");
       break;
     case 6:
       printf("\n Не определен массив данных для модуля select");
       break;
     case 7:
       printf("\n Не определен массив данных для модуля insert");
       break;
     case 8:
       printf("\n Не определен массив данных для модуля Shell");
       break;
     case 9:
       printf("\n Не определен массив данных для модуля quick");
       break;
   }
}


void SORT :: ProvSort()
{
unsigned  int i;

    if(KeSort < 2){
       ErrorCode=3;
       ShowMsg();
       return;
    }
    for(i=1; i<KeSort; i++)
    	if(Mas[i-1]> Mas[i]){
           ErrorCode=5;
           ShowMsg();
           return;
        }
    return;
}

void SORT :: bubble()
{
//  Сортировка пузырьком

unsigned  int a,b;
unsigned  int t;

    if(!KeSort){
       ErrorCode=4;
       ShowMsg();
       return;
    }
    for(a=1; a<KeSort; a++)
        for(b=KeSort-1; b>=a; b--)
      	    if(Mas[b-1] > Mas[b]){t=Mas[b-1]; Mas[b-1]=Mas[b]; Mas[b]=t;}
    return;
}

void  SORT :: select()
{
//  Cортировка отбором
unsigned  int a,b,c;
bool flag;
unsigned  int t;

    if(!KeSort){
       ErrorCode=6;
       ShowMsg();
       return;
    }
    for(a=0; a<KeSort-1; a++){
        flag=false;
        c=a;
        t=Mas[a];
        for(b=a+1; b<KeSort; b++)
            if(Mas[b] < t){c=b; t=Mas[b]; flag=true;}
        if(flag){Mas[c]=Mas[a]; Mas[a]=t;}
    }
    return;
}
void SORT :: insert()
{
// Сортировка вставкой
unsigned  int a,b;
unsigned int t;

    if(!KeSort){
       ErrorCode=7;
       ShowMsg();
       return;
    }
    for(a=1; a<KeSort; a++){
        t=Mas[a];
        for(b=a-1;b>=0 && t<Mas[b]; b--)Mas[b+1]=Mas[b];
        Mas[b+1]=t;
    }
    return;
}

void SORT :: Shell()
{
  unsigned  int gap,i,j;
  unsigned int t;

  if(!KeSort){
     ErrorCode=8;
     ShowMsg();
     return;
  }
  for(gap=KeSort/2; gap>0; gap/=2)
		for(i=gap; i<KeSort; i++)
			 for(j=i-gap; j>=0 && Mas[j]>Mas[j+gap]; j-=gap){
				  t=Mas[j]; Mas[j]=Mas[j+gap]; Mas[j+gap]=t;
			 }
}

void SORT :: quick()
{
  if(!KeSort){
     ErrorCode=9;
     ShowMsg();
     return;
  }
  qs(Mas,0,KeSort-1);
}
void SORT :: qs(unsigned int *A, unsigned  int left, unsigned  int right)
{
	unsigned  int i,j;
	unsigned int x,y;

	i=left; j=right;
	x=A[(left+right)/2];
	do
	{
	  while(A[i] < x && i<right) i++;
	  while(x< A[j] && j > left)j--;
	  if(i <= j){
		  y=A[i];
		  A[i]=A[j];
		  A[j]=y;
		  i++; j--;
	  }
  }while(i<=j);
  if(left < j) qs(A,left,j);
  if(i < right) qs(A,i,right);
}

Соседние файлы в папке C++