ここに、そのようなマージソートの例があります:-)
void TRIPLE_MERGESORT(vector<double> &A, int k, int l)
{
if(k<l)
{
int one_third = (l-k)/3;
int two_third = 2*(l-k)/3; // k < k+one_third < k+two_third < l
TRIPLE_MERGESORT(A,k,k+one_third);
TRIPLE_MERGESORT(A,k+one_third+1,k+two_third);
TRIPLE_MERGESORT(A,k+two_third+1,l);
MERGE(A,k,k+one_third,k+two_third);
MERGE(A,k,k+two_third,l);
}
}
MERGE は配列 (ベクトル) をマージします。これは、たとえば次のように実装できます。
void MERGE(vector<double> &A, int p, int q, int r)
{
int i = p;
int j = q+1;
int lenght = r - p + 1;
int k=0;
vector<double> merged;
merged.assign (lenght,0);
while((i<=q)&&(j<=r))
{
if(A[i] <= A[j])
{
merged[k]=A[i];
++i;
}
else
{
merged[k]=A[j];
++j;
}
k++;
}
if(j<=r)
{
while(j<=r)
{
merged[k]=A[j];
++j;
++k;
}
}
if(i<=q)
{
while(i<=q)
{
merged[k]=A[i];
++i;
++k;
}
}
for (i=0;i<lenght;++i)
A[p+i]=merged[i];
}
良い1日を :)
//編集://
正確に言うことはできませんが (しかし、おそらく他の誰かがより適切に、そしてなぜこのようになっているのかを言うでしょう)、3 つの部分に分割することは、通常のマージソートよりも複雑 (およびより多くの作業が必要) であるため、より多くの時間がかかります。O(n ^ 2)になると思いますが、通常のマージソートよりも悪いのは確かです:)