求解这段归并排序的代码错在哪儿

求解这段归并排序的代码错在哪里?
// 2-路归并排序.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include<stdio.h>

int tr2[5] = {0} ;

void Merge(int sr[], int tr[], int i, int m, int n){
//将有序的sr[i..m]和sr[m+1..n]归并为有序的tr[i..n]
int j,k;
for(j = m + 1,k = i;k <= m && j <= n ; ++i){//将sr中记录由小到大地并入tr
if(sr[k] <= sr[j]) tr[i] = sr[k++];
else tr[i] = sr[j++];
}
while(k <= m) tr[i++] = sr[k++];//将剩余的sr[i..m]复制到tr
while(j <= n) tr[i++] = sr[j++];//将剩余的sr[j..n]复制到tr
}

void MSort(int sr[], int tr1[], int s, int t) {
//将sr[s..t]归并排序为tr1[s..t]
if(s == t) tr1[s] = sr[s];
else {
int m = (s + t) / 2;//将sr[s..t]平分为sr[s..m]和sr[m+1..t]
MSort(sr, tr2, s, m);//递归地将sr[s..m]归并为有序的tr2[s..m]
MSort(sr, tr2, m + 1, t);//递归地将sr[m+1..t]归并为有序的tr2[m+1..t]
Merge(tr2, tr1, s, m, t);//将tr2[s..m]和tr2[m+1..t]归并到tr1[s..t]
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int num[5] = {42,35,15,92,33};
MSort(num,num,0,4);
for(int i = 0; i < 5; ++i) {
printf("%d ",num[i]);
}
return 0;
}
//输出结果是:15 15 15 33 33 请问怎么回事?

------解决方案--------------------
in place merge不会写就别乱写,老老实实开个新数组merge
------解决方案--------------------
#include<stdio.h>
#include<stdlib.h>
typedef int RecType;//要排序元素类型
void Merge(RecType *R,int low,int m,int high)
    {
//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]

     int i=low,j=m+1,p=0;     //置初始值
     RecType *R1;             //R1是局部向量
     R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
     if(!R1)return;           //申请空间失败
     while(i<=m&&j<=high)     //两子文件非空时取其小者输出到R1[p]上
   R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
     while(i<=m)              //若第1个子文件非空,则复制剩余记录到R1中
       R1[p++]=R[i++];
     while(j<=high)            //若第2个子文件非空,则复制剩余记录到R1中
       R1[p++]=R[j++];
     for(p=0,i=low;i<=high;p++,i++)
       R[i]=R1[p];            //归并完成后将结果复制回R[low..high]
    }

void MergeSort(RecType R[],int low,int high)
{               
//用分治法对R[low..high]进行二路归并排序
       int mid;
       if(low<high)
   {  
   //区间长度大于1
          mid=(low+high)/2;       //分解
          MergeSort(R,low,mid);       //递归地对R[low..mid]排序
          MergeSort(R,mid+1,high);    //递归地对R[mid+1..high]排序
          Merge(R,low,mid,high);       //组合,将两个有序区归并为一个有序区
        }
     }
void main()
{
 int a[8]={21,34,56,43,99,37,78,10};     //这里对8个元素进行排序
 int low=0,high=7;                       //初始化low和high的值
 MergeSort(a,low,high);
 for(int i=low;i<=high;i++)printf("%d ",a[i]);        //输出测试
 printf("\n");
 getchar();
}
------解决方案--------------------
网上搜到的的一个算法

http://www.ahathinking.com/archives/103.html

你可以看一看。