410 lines
23 KiB
Plaintext
410 lines
23 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| sSortTest.mq5 |
|
|
//| Integer |
|
|
//| https://login.mql5.com/en/users/Integer |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Integer"
|
|
#property link "https://login.mql5.com/en/users/Integer"
|
|
#property version "1.00"
|
|
//+------------------------------------------------------------------+
|
|
//| Script program start function |
|
|
//+------------------------------------------------------------------+
|
|
void OnStart()
|
|
{
|
|
Alert("Start");
|
|
|
|
int Size=10000;
|
|
double x0[];
|
|
double x1[];
|
|
ArrayResize(x0,Size);
|
|
ArrayResize(x1,Size);
|
|
|
|
long start;
|
|
long t,t1=0,t2=0,t3=0,t4=0,t5=0,t6=0;
|
|
|
|
int Rounds=30;
|
|
|
|
for(int j=0;j<Rounds;j++)
|
|
{
|
|
|
|
Alert("==> Pass "+IntegerToString(j+1));
|
|
|
|
for(int i=0;i<Size;i++)
|
|
{
|
|
x0[i]=MathRand();
|
|
}
|
|
|
|
ArrayCopy(x1,x0);
|
|
start=GetTickCount();
|
|
SortBubbleUp(x1);
|
|
t=GetTickCount()-start;
|
|
t1+=t;
|
|
Alert("Bubble: "+IntegerToString(t));
|
|
Check(x1);
|
|
|
|
ArrayCopy(x1,x0);
|
|
start=GetTickCount();
|
|
SortSelectUp(x1);
|
|
t=GetTickCount()-start;
|
|
t2+=t;
|
|
Alert("Select: "+IntegerToString(t));
|
|
Check(x1);
|
|
|
|
ArrayCopy(x1,x0);
|
|
start=GetTickCount();
|
|
SortInsertUp(x1);
|
|
t=GetTickCount()-start;
|
|
t3+=t;
|
|
Alert("Insert: "+IntegerToString(t));
|
|
Check(x1);
|
|
|
|
ArrayCopy(x1,x0);
|
|
start=GetTickCount();
|
|
SortShellUp(x1);
|
|
t=GetTickCount()-start;
|
|
t4+=t;
|
|
Alert("Shell: "+IntegerToString(t));
|
|
Check(x1);
|
|
|
|
ArrayCopy(x1,x0);
|
|
start=GetTickCount();
|
|
SortHoareUp(x1);
|
|
t=GetTickCount()-start;
|
|
t5+=t;
|
|
Alert("Hoare: "+IntegerToString(t));
|
|
Check(x1);
|
|
|
|
ArrayCopy(x1,x0);
|
|
start=GetTickCount();
|
|
SortSelectUpFst(x1);
|
|
t=GetTickCount()-start;
|
|
t6+=t;
|
|
Alert("SelectFst: "+IntegerToString(t));
|
|
Check(x1);
|
|
}
|
|
|
|
Alert("==> Average:");
|
|
Alert("Bubble: "+IntegerToString(t1/Rounds));
|
|
Alert("Select: "+IntegerToString(t2/Rounds));
|
|
Alert("Insert: "+IntegerToString(t3/Rounds));
|
|
Alert("Shell: "+IntegerToString(t4/Rounds));
|
|
Alert("Hoare: "+IntegerToString(t5/Rounds));
|
|
Alert("SelectFst: "+IntegerToString(t6/Rounds));
|
|
|
|
Alert("Finish");
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Checks if array is alrady sorted (ascending) |
|
|
//+------------------------------------------------------------------+
|
|
void Check(double &aAr[])
|
|
{
|
|
for(int i=ArraySize(aAr)-1;i>0;i--)
|
|
{
|
|
if(aAr[i]<aAr[i-1])
|
|
{
|
|
Alert("Error");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| ArrayAlertR |
|
|
//| Prints array as line |
|
|
//+------------------------------------------------------------------+
|
|
void ArrayAlertR(double &aAr[],int aDigits=0,string aHeader="")
|
|
{
|
|
int Len=ArraySize(aAr);
|
|
string str=aHeader+": ";
|
|
for(int i=0;i<Len;i++)
|
|
{
|
|
str=str+DoubleToString(aAr[i],aDigits)+", ";
|
|
}
|
|
Alert(str);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| ArrayAlertC |
|
|
//| Prints array as column |
|
|
//+------------------------------------------------------------------+
|
|
void ArrayAlertC(double &aAr[],int aDigits=0,string aHeader="")
|
|
{
|
|
int Len=ArraySize(aAr);
|
|
Alert("=== "+aHeader+" ===");
|
|
for(int i=0;i<Len;i++)
|
|
{
|
|
Alert(IntegerToString(i)+": "+DoubleToString(aAr[i],aDigits));
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortHoareUp |
|
|
//+------------------------------------------------------------------+
|
|
void SortHoareUp(double &aAr[])
|
|
{
|
|
HoareUp(aAr,0,ArraySize(aAr)-1);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| HoareUp |
|
|
//| Auxiliary function for Hoare sort |
|
|
//+------------------------------------------------------------------+
|
|
void HoareUp(double &aAr[],int aLeft,int aRight)
|
|
{
|
|
double tmp;
|
|
int i=aLeft;
|
|
int j=aRight;
|
|
double xx=aAr[(aLeft+aRight)/2];
|
|
do
|
|
{
|
|
while(i<aRight && aAr[i]<xx)i++;
|
|
while(j>aLeft && xx<aAr[j])j--;
|
|
if(i<=j)
|
|
{
|
|
tmp=aAr[i];
|
|
aAr[i]=aAr[j];
|
|
aAr[j]=tmp;
|
|
i++;
|
|
j--;
|
|
}
|
|
}
|
|
while(i<=j);
|
|
if(aLeft<j)HoareUp(aAr,aLeft,j);
|
|
if(i<aRight)HoareUp(aAr,i,aRight);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortHoareDn |
|
|
//+------------------------------------------------------------------+
|
|
void SortHoareDn(double &aAr[])
|
|
{
|
|
HoareDn(aAr,0,ArraySize(aAr)-1);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| HoareDn |
|
|
//| Auxiliary function for Hoare sort |
|
|
//+------------------------------------------------------------------+
|
|
void HoareDn(double &aAr[],int aLeft,int aRight)
|
|
{
|
|
double tmp;
|
|
int i=aLeft;
|
|
int j=aRight;
|
|
double xx=aAr[(aLeft+aRight)/2];
|
|
do
|
|
{
|
|
while(i<aRight && aAr[i]>xx)i++;
|
|
while(j>aLeft && xx>aAr[j])j--;
|
|
if(i<=j)
|
|
{
|
|
tmp=aAr[i];
|
|
aAr[i]=aAr[j];
|
|
aAr[j]=tmp;
|
|
i++;
|
|
j--;
|
|
}
|
|
}
|
|
while(i<=j);
|
|
if(aLeft<j)HoareDn(aAr,aLeft,j);
|
|
if(i<aRight)HoareDn(aAr,i,aRight);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortShellUp |
|
|
//+------------------------------------------------------------------+
|
|
void SortShellUp(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int n[]={9,5,3,2,1};
|
|
int i,j,k,g;
|
|
int Len=ArraySize(aAr);
|
|
for(k=0;k<5;k++)
|
|
{
|
|
g=n[k];
|
|
for(i=g;i<Len;i++)
|
|
{
|
|
tmp=aAr[i];
|
|
for(j=i-g;j>=0 && tmp<aAr[j];j-=g)
|
|
{
|
|
aAr[j+g]=aAr[j];
|
|
}
|
|
aAr[j+g]=tmp;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortShellDn |
|
|
//+------------------------------------------------------------------+
|
|
void SortShellDn(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int n[]={9,5,3,2,1};
|
|
int i,j,k,g;
|
|
int Len=ArraySize(aAr);
|
|
for(k=0;k<5;k++)
|
|
{
|
|
g=n[k];
|
|
for(i=g;i<Len;i++)
|
|
{
|
|
tmp=aAr[i];
|
|
for(j=i-g;j>=0 && tmp>aAr[j];j-=g)
|
|
{
|
|
aAr[j+g]=aAr[j];
|
|
}
|
|
aAr[j+g]=tmp;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortInsertUp |
|
|
//+------------------------------------------------------------------+
|
|
void SortInsertUp(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j,Len=ArraySize(aAr);
|
|
for(i=1;i<Len;i++)
|
|
{
|
|
tmp=aAr[i];
|
|
for(j=i-1;j>=0 && tmp<aAr[j];j--)
|
|
{
|
|
aAr[j+1]=aAr[j];
|
|
aAr[j]=tmp;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortInsertDn |
|
|
//+------------------------------------------------------------------+
|
|
void SortInsertDn(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j,Len=ArraySize(aAr);
|
|
for(i=1;i<Len;i++)
|
|
{
|
|
tmp=aAr[i];
|
|
for(j=i-1;j>=0 && tmp>aAr[j];j--)
|
|
{
|
|
aAr[j+1]=aAr[j];
|
|
aAr[j]=tmp;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortSelectUp |
|
|
//+------------------------------------------------------------------+
|
|
void SortSelectUp(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j,k;
|
|
int Len=ArraySize(aAr);
|
|
int Len1=Len-1;
|
|
for(i=0;i<Len1;i++)
|
|
{
|
|
tmp=aAr[i];
|
|
k=i;
|
|
for(j=i+1;j<Len;j++)
|
|
{
|
|
if(aAr[j]<tmp)
|
|
{
|
|
k=j;
|
|
tmp=aAr[j];
|
|
}
|
|
}
|
|
aAr[k]=aAr[i];
|
|
aAr[i]=tmp;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortSelectDn |
|
|
//+------------------------------------------------------------------+
|
|
void SortSelectDn(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j,k;
|
|
int Len=ArraySize(aAr);
|
|
int Len1=Len-1;
|
|
for(i=0;i<Len1;i++)
|
|
{
|
|
tmp=aAr[i];
|
|
k=i;
|
|
for(j=i+1;j<Len;j++)
|
|
{
|
|
if(aAr[j]>tmp)
|
|
{
|
|
k=j;
|
|
tmp=aAr[j];
|
|
}
|
|
}
|
|
aAr[k]=aAr[i];
|
|
aAr[i]=tmp;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortBubbleUp |
|
|
//+------------------------------------------------------------------+
|
|
void SortBubbleUp(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j;
|
|
int Len=ArraySize(aAr);
|
|
int Len1=Len-1;
|
|
for(i=1;i<Len;i++)
|
|
{
|
|
for(j=Len1;j>=i;j--)
|
|
{
|
|
if(aAr[j-1]>aAr[j])
|
|
{
|
|
tmp=aAr[j-1];
|
|
aAr[j-1]=aAr[j];
|
|
aAr[j]=tmp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortBubbleDn |
|
|
//+------------------------------------------------------------------+
|
|
void SortBubbleDn(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j;
|
|
int Len=ArraySize(aAr);
|
|
int Len1=Len-1;
|
|
for(i=1;i<Len;i++)
|
|
{
|
|
for(j=Len1;j>=i;j--)
|
|
{
|
|
if(aAr[j-1]<aAr[j])
|
|
{
|
|
tmp=aAr[j-1];
|
|
aAr[j-1]=aAr[j];
|
|
aAr[j]=tmp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortSelectUpFst |
|
|
//+------------------------------------------------------------------+
|
|
void SortSelectUpFst(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j,Len=ArraySize(aAr)-1;
|
|
for(i=0;i<Len;i++)
|
|
{
|
|
j=ArrayMinimum(aAr,i);
|
|
tmp=aAr[i];
|
|
aAr[i]=aAr[j];
|
|
aAr[j]=tmp;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| SortSelectDnFst |
|
|
//+------------------------------------------------------------------+
|
|
void SortSelectDnFst(double &aAr[])
|
|
{
|
|
double tmp;
|
|
int i,j,Len=ArraySize(aAr)-1;
|
|
for(i=0;i<Len;i++)
|
|
{
|
|
j=ArrayMaximum(aAr,i);
|
|
tmp=aAr[i];
|
|
aAr[i]=aAr[j];
|
|
aAr[j]=tmp;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|