可以运用分而治之方法来解决排序问题,该问题是将n 个元素排成非递减顺序。分而治之方法通常用以下的步骤来进行排序算法:若n为1,算法终止;否则,将这一元素集合分割成两个或更多个子集合,对每一个子集合分别排序,然后将排好序的子集合归并为一个集合。 代码如下:
void
InsertionSort(
int
a[],
int
start,
int
end)
{
if (a == NULL)
return ;
for ( int i = start + 1 ; i <= end; ++ i)
{
int j = i - 1 ;
int t = a[i];
while (j >= start && a[j] > t)
{
a[j + 1 ] = a[j];
-- j;
}
a[j + 1 ] = t;
}
}
void MergeSort( int a[], int start, int end)
{
static const int CUTOFF = 16 ;
if (a == NULL)
return ;
if (end - start < CUTOFF)
{
InsertionSort(a, start, end);
return ;
}
int mid = (start + end) / 2 ;
MergeSort(a, start, mid);
MergeSort(a, mid + 1 , end);
int * p1 = new int [mid - start + 1 ];
int * p2 = new int [end - mid];
memcpy(p1, a + start, sizeof ( int ) * (mid - start + 1 ));
memcpy(p2, a + mid + 1 , sizeof ( int ) * (end - mid));
int i = 0 , iMax = mid - start;
int j = 0 , jMax = end - mid - 1 ;
int k = start; // not zero
while (i <= iMax && j <= jMax)
{
if (p1[i] <= p2[j])
a[k ++ ] = p1[i ++ ];
else
a[k ++ ] = p2[j ++ ];
}
while (i <= iMax)
a[k ++ ] = p1[i ++ ];
while (j <= jMax)
a[k ++ ] = p2[j ++ ];
delete[] p1;
delete[] p2;
}
{
if (a == NULL)
return ;
for ( int i = start + 1 ; i <= end; ++ i)
{
int j = i - 1 ;
int t = a[i];
while (j >= start && a[j] > t)
{
a[j + 1 ] = a[j];
-- j;
}
a[j + 1 ] = t;
}
}
void MergeSort( int a[], int start, int end)
{
static const int CUTOFF = 16 ;
if (a == NULL)
return ;
if (end - start < CUTOFF)
{
InsertionSort(a, start, end);
return ;
}
int mid = (start + end) / 2 ;
MergeSort(a, start, mid);
MergeSort(a, mid + 1 , end);
int * p1 = new int [mid - start + 1 ];
int * p2 = new int [end - mid];
memcpy(p1, a + start, sizeof ( int ) * (mid - start + 1 ));
memcpy(p2, a + mid + 1 , sizeof ( int ) * (end - mid));
int i = 0 , iMax = mid - start;
int j = 0 , jMax = end - mid - 1 ;
int k = start; // not zero
while (i <= iMax && j <= jMax)
{
if (p1[i] <= p2[j])
a[k ++ ] = p1[i ++ ];
else
a[k ++ ] = p2[j ++ ];
}
while (i <= iMax)
a[k ++ ] = p1[i ++ ];
while (j <= jMax)
a[k ++ ] = p2[j ++ ];
delete[] p1;
delete[] p2;
}