归并排序的思想很像是插入排序,只不过插入的元素是已经排序好了的数组。
void CMergeSort::Merge(double R[], double R1[], int low, int mid, int high)
{
int i=low,j=mid+1,k=low;
while ((i<=mid) && (j<=high))
{
if (R[i] <= R[j])
{
R1[k++] = R[i++];
}
else
{
R1[k++] = R[j++];
}
}
while (i<=mid)
{
R1[k++] = R[i++];
}
while (j<=high)
{
R1[k++] = R[j++];
}
}
void CMergeSort::MergePass(double R[], double R1[], int n)
{
int low = 0;
int mid = low + n -1;
int high = low + 2 * n -1;
while (high < lenth)
{
Merge(R, R1, low, mid, high);
low = high + 1;
mid = low + n -1;
high = low + 2 * n - 1;
}
//处理剩余文件
if(mid < lenth-1)//剩余两个文件夹,其中一个长度小于lenth
{
Merge(R, R1, low, mid, lenth-1);
}
else//只有一个子文件夹
{
for (int i=low; i<lenth;i++)
{
R1[i] = R[i];
}
}
}
void CMergeSort::MergeSort()
{
int n;
n = 1;
while (n < lenth)
{
MergePass(m_num, m_num1, n);
n = 2 * n;
MergePass(m_num1, m_num, n);
n = 2 * n;
}
}
在处理过程中要考虑的是待归并数组的边界。还有临时数组R1的引入,简化了数据频繁交换移动。