可以运用分而治之方法来解决排序问题,该问题是将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;
}
本文介绍了一种利用分而治之策略实现的排序算法。该算法通过将待排序序列分成若干子序列,并分别对这些子序列进行排序,最后再将它们合并成一个有序序列。当子序列长度小于16时,采用插入排序提高效率。

577

被折叠的 条评论
为什么被折叠?



