class DArray{
public void mergeSort(int[] arr,int left,int right){
if(left<right){
int center = (left+right)/2;
mergeSort(arr,left,center);
mergeSort(arr,center+1,right);
merge(arr,left,center+1,right);
}
}

public void merge(int[] arr,int left,int center,int right){
int[] a = new int[right-left];
int lef = left;
int cen = center;
int k = 0;
while(lef<center && cen<right){
if(arr[lef]<=arr[cen]){
a[k++] = arr[lef++];
}else{
a[k++] = arr[cen++];
}
}
while(lef<center){
a[k++] = arr[lef++];
}
while(cen<right){
a[k++] = arr[cen++];
}
for(int i=0;i<a.length;i++){
arr[i] = a[i];
}
}
}
public class MergeSortApp{
public static void main (String[] args) {
     int[] arr = {22,66,11,44,88,33,34};
     DArray d = new DArray();    
d.mergeSort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print (arr[i]+" ");
}
System.out.println ();
    }    
}找不到哪个地方有问题``麻烦指点下,
希望,高手能给个好点的归并排序算法,(最好带注释)

解决方案 »

  1.   

    http://blog.csdn.net/luxiaoshuai/archive/2008/11/17/3318056.aspx
    这是我博客里的一篇 以前写的.希望对你有帮助.
      

  2.   

     归并就是将多个已排序的数列合成一个有序的数列。将两个有序序列合并为一个有序序列叫二路归并(merge)。归并排序就是利用"归并"技术来进行排序n长度为1的子序列,两两归并最后变为有序的序列。这是刚GOOGLE到的我没试过,看你代码,应该是
     merge(arr,left,center+1,right);   调用地方错了
      

  3.   

    public class MergeSort { public static void main(String[] args) {
    int a[] = { 21, 34, 56, 43, 99, 37, 78, 10 };// 这里对8个元素进行排序
    int low = 0, high = 7;// 初始化low和high的值
    // 辅助数组b
    int b[] = new int[a.length]; System.out.print("排序前:");
    for (int i = 0; i <= high; i++) {
    System.out.print(a[i] + " ");
    }
    // 归并排序
    mergerSort(a, low, high, b); System.out.print("排序后:");
    for (int i = 0; i <= high; i++) {
    System.out.print(a[i] + " ");
    }
    } /**
     * 分治和归并
     * 
     * @param a
     * @param low
     * @param high
     * @param b
     */
    public static void mergerSort(int a[], int low, int high, int b[]) {
    int mid = 0;
    if (low < high) {
    mid = (high + low) / 2;// 分治位置
    mergerSort(a, low, mid, b);
    mergerSort(a, mid + 1, high, b);
    merger(a, low, mid, high, b);// 归并
    } } /**
     * 合并两个有序子序列
     * 
     * @param a
     * @param low
     * @param mid
     * @param high
     * @param b
     *            辅助数组
     */
    public static void merger(int[] a, int low, int mid, int high, int b[]) { int i = low;
    int j = mid + 1;
    int p = 0;
    // 合并两个有序数组 子序列1 a[low..mid] 子序列2 a[mid+1..high]
    while (i <= mid && j <= high) {
    b[p++] = (a[i] <= a[j]) ? a[i++] : a[j++];
    }
    // 如果子序列1没有合并完则直接复制到复制数组中去
    while (i <= mid) {
    b[p++] = a[i++];
    }
    // 如果子序列2没有合并完则直接复制到复制数组中去
    while (j <= high) {
    b[p++] = a[j++];
    }
    // 把辅助数组的元素复制到原来的数组中去
    for (p = 0, i = low; i <= high; i++, p++) {
    a[i] = b[p];
    }
    }
    }给你一段啊,网上有啊,上面的注解详细你可以看一下
      

  4.   


    class DArray{
        public void mergeSort(int[] arr,int left,int right){
            if(left<right){        
                int center = (left+right)/2;
                mergeSort(arr,left,center);
                mergeSort(arr,center+1,right);
                merge(arr,left,center+1,right);    
            }                
        }
        
    //将arr的子数组arr[left,center-1]和arr[center,right]合并
        public void merge(int[] arr,int left,int center,int right){
            int[] a = new int[right-left+1];//arr的长度应该是right-left+1   
            int lef = left;
            int cen = center;
            int k = 0;
            while(lef<center && cen<=right){//右侧数组的最后一个元素的下标应该是right
                            //所有cen应该索引到right
                if(arr[lef]<=arr[cen]){
                    a[k++] = arr[lef++];
                }else{
                    a[k++] = arr[cen++];
                }
            }
            while(lef<center){
                a[k++] = arr[lef++];
            }
            while(cen<=right){//同上
                a[k++] = arr[cen++];
            }
            for(int i=0,j=left;i<a.length;i++,j++){
                arr[j] = a[i];//应该是将arr的子数组arr[left,right]进行合并
      //所以复制的开始下标应该是left,而不是0.
            }    
        }
    }
    public class MergeSortApp{    
        public static void main (String[] args) {        
            int[] arr = {22,66,11,44,88,33,34};
            DArray d = new DArray();        
            d.mergeSort(arr,0,arr.length-1);        
            for(int i=0;i<arr.length;i++){
                System.out.print (arr[i]+" ");
            }
            System.out.println ();            
        }    
    }
     已经把有问题的地方改过来了,在有问题的地方坐了注释,方便楼主对照。
    楼主的问题就是数组下标没有考虑清楚。注意下就可以了