//二路归并排序
void myMerge(int R[], int R1[], int nLow, int nMid, int nHigh)
{
int i = nLow;//原序列的开始位置
int j = nMid + 1;//在原序列中有两条序列,这是后一条序列的起始位置
int k = nLow;//这是将要放置比较后元素的序列
while ((i <= nMid) && (j <= nHigh))
{
if (R[i] < R[j])//首先判断前面的序列的最小值是否小于后面序列的最小值,如果小于那么他就是整个两条序列中的最小值 //当然你也可以设置为大于,那样就是逆序了
{
R1[k++] = R[i++];//将小于的元素赋值进新的辅助序列中
}
else
{
R1[k++] = R[j++];//将小于的元素赋值进新的辅助序列中
}
}
while (i <= nMid)
{
R1[k++] = R[i++];//因为有可能前面序列和后面序列是长度不等的,当比较完后,后面的序列早已是排完序的,只要赋值进辅助序列就好
}
while (j <= nHigh)
{
R1[k++] = R[j++];//因为有可能前面序列和后面序列是长度不等的,当比较完后,后面的序列早已是排完序的,只要赋值进辅助序列就好
}
}
void myMergePass(int R[], int R1[], int nLength, int n)
{
int i = 0;
while ((i + 2 * nLength - 1) < n)//这种情况是刚好整个序列可以分为i = (n/nLength) i = 1, 2, 3 ........整数
{
myMerge(R, R1, i, i + nLength - 1, i + 2 * nLength - 1);
i = i + 2 * nLength;
//当中间元素大于或者等于或者小于时候分两种情况
if ((i + nLength - 1) < (n - 1))//当中间元素小于n-1说明有2个序列并且后一个长度小于nLength..那为什么后面的长度小于nLength呢?//因为若if成立..必定[i, i + nLength - 1]是存在的..长度为nLength,但是[i + nLength - 1, i + 2 * nLength - 1]..因为上面的while已经包含了i + 2 * nLength = n - 1的情况..//所以只能用i + nLength - 1判断..那么 //i + nLength - 1 < n - 1...//i + 2 * nLength > n - 1时,必定[i + nLength - 1, n - 1]的值是要小于nLength的 //如果nLength = n-1时,那么就是只剩下一个前序列,如果大于那就是只有一个序列..因为这样 i < (n - 1)//那么到i到n - 1的距离肯定不够nLength..因为i + nLength - 1已经大于了n - 1
{
myMerge(R, R1, i, i + nLength, n - 1);
}
else
{
for (int j = i; j < n; j++)//最后剩下的是已经排好序的前序列
{
R1[j] = R[j];
}
}
}
void myMergeSort(int R[], int n)
{
int nLength = 1;
int* nTempArray = new int[n];
while (nLength < n)
{
myMergePass(R, nTempArray, nLength, n);
nLength = 2 * nLength;
myMergePass(nTempArray, R, nLength, n);
nLength = 2 * nLength;
}
delete nTempArray;
}