public class MergeSort {

public void Merge(int[] src,int s,int m,int t){
int temp;
for(int i=s, j=m+1;i<=m&&j<=t;){
if(src[i]>src[j]){
temp=src[i];
src[i]=src[j];
src[j]=temp;
i++;
}else{
j++;
}

}
}

public void MSort(int[] src,int s,int t){
if(s==t){
src[s]=src[t];
}else{
int m=(t+s)/2;
MSort(src,s,m);
MSort(src,m+1,t);
Merge(src,s,m,t);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] source=new int[10];
for(int i=0;i<source.length;i++){
source[i]=(int) (Math.random()*10);
}
//输入源数组
for(int i=0;i<source.length;i++){
System.out.print(source[i]+" ");
}
MergeSort ms=new MergeSort();
ms.MSort(source,0,source.length-1);

//输入源数组
System.out.println("output:");
for(int i=0;i<source.length;i++){
System.out.print(source[i]+" ");
}
}}运行结果:4 0 6 4 4 4 1 3 4 8 output:
          0 4 6 4 4 1 4 3 4 8 
为什么不对啊,我检查了好几遍,一直找不到错误,请教高手!!!merge

解决方案 »

  1.   

    你合并方法有问题,自己模拟一下就知道了。这里写了一个。
    public void Merge(int[] arrays,int start,int m,int end){
            int length=end-start+1;
            int temp[]=new int[length];//用来存放比较的数组,用完复制回到原来的数组
            int i=start;
            int j=m+1;
            int c=0;
            while(i<=m &&j<=end){
                if(arrays[i]<arrays[j]){
                    temp[c]=arrays[i];
                    i++;
                }else{
                    temp[c]=arrays[j];
                    j++;
                }
                c++;
            }
            while(i<=m){
                temp[c++]=arrays[i++];
            }
            while(j<=end){
            temp[c++]=arrays[j++];
            }
            
            c=0;
            for(int t=start;t<=end;t++,c++){
                arrays[t]=temp[c];
            }
        }
      

  2.   


    谢谢,是的,我的merge函数有问题的  
      

  3.   


    细节错误。归并排序的一个重要特点是“稳定性”(保持相等元素的自然顺序),把第8行的"<"改成"<="。