我写的归并排序请问在哪里出问题了?一直找不到哪里错了

 import java.util.*;

public class Solution {
    public int[] mergeSort(int[] A, int n) {
        sort(A,0,n-1);
        return A;
    }

    public void sort(int[] data, int left, int right) {
        if(left<right) {
            int middle = (left+right)/2;
            sort(data, left, middle);
            sort(data, middle+1, right);
            merge(data, left, middle, right);
        }
    }

    public void merge(int[] data, int left, int middle, int right) {
        int leftpos = left;
        int leftend = middle;
        int rightpos = middle+1;
        int rightend = right;

        int[] tmp = new int[rightend-leftpos+1];

        for(int i=leftpos;i<tmp.length;i++) {
            if(leftpos<=leftend&&rightpos<=rightend) {
                if(data[leftpos]<data[rightpos]) {
                    tmp[i] = data[leftpos];
                    leftpos++;
                }else {
                    tmp[i] = data[rightpos];
                    rightpos++;
                }
            }else if(leftpos<=leftend) {
                tmp[i] = data[leftpos];
                leftpos++;
            }else if(rightpos<=rightend) {
                tmp[i] = data[rightpos];
                rightpos++;
            }
        }

        for(int j=left;j<tmp.length;j++) {
            data[j] = tmp[j];
        }
    }
}

1)for(int i=leftpos;i<tmp.length;i++) {
i是tmp数组的下标,leftpos是data数组的下标,毫无关系啊。
2)data[j] = tmp[j];
j能即做data的下标又做tmp的下标?

首先,这不是二分查找;算是合并排序。
使用递归算法的要点是设计后退出条件。sort 的退出条件存在问题,程序无法退出。

public void sort(int[] data, int left, int right) {
if(left int middle = (left+right)/2;
sort(data, left, middle);
sort(data, middle+1, right);
merge(data, left, middle, right);
}
else if (left == right +1)
{
if (data[left] > data[right]) {
int temp = data[left];
data[left] = data[right];
data[right]=data[left];
}

            }
}
 public void sort(int[] data, int left, int right) {
    if(left < right + 1) {
        int middle = (left+right)/2;
        sort(data, left, middle);
        sort(data, middle+1, right);
        merge(data, left, middle, right);
    }
    else if (left == right +1) {
        int temp = data[left];
        data[left] = data[right];
        data[right]=data[left];
    }
}
 public void sort(int[] data, int left, int right) {
    if (left == right)  {
        // 可以忽略
    }
    else if (left == right + 1) {
        int temp = data[left];
        data[left] = data[right];
        data[right]=data[left];
    }
    else if(left > right + 1) {
        int middle = (left+right)/2;
        sort(data, left, middle);
        sort(data, middle+1, right);
        merge(data, left, middle, right);
    }
}

i<tmp.length-1 数组的下标从0开始的