Java 递归合并排序优化空间

Java 递归合并排序优化空间,java,recursion,mergesort,Java,Recursion,Mergesort,在我的任务中,我的任务是实现一个合并排序,该排序使用一个临时数组,其大小为原始数组的一半。我很难理解如何让它工作。它有时会起作用,但某些值会使它失去作用。在这方面的任何帮助或指导都会有所帮助。这是我目前的代码: public void sort(T[] items) { // Your sort should work without allocating any more memory than this... T[] temp = (T[]) new Comparable[

在我的任务中,我的任务是实现一个合并排序,该排序使用一个临时数组,其大小为原始数组的一半。我很难理解如何让它工作。它有时会起作用,但某些值会使它失去作用。在这方面的任何帮助或指导都会有所帮助。这是我目前的代码:

public void sort(T[] items) {

    // Your sort should work without allocating any more memory than this...
    T[] temp = (T[]) new Comparable[(items.length + 1) / 2];
    mergesort(items, temp, 0, items.length - 1);

}
private void mergesort(T[] items, T[] temp, int left, int right) {
    if (left == right) {
        return; // Region has one record
    }

    int mid = ((right + left)) / 2; // Select midpoint  
    mergesort(items, temp, left, mid); // Mergesort first half
    mergesort(items, temp, mid + 1, right);
    merge(items,temp,left,mid,right);
}

/**
 * Merge two sorted sub-arrays.
 */
private void merge(T[] items, T[] temp, int left, int mid, int right) {
    int count = 0;
    for (int i = left; i <= right; i++) {
        if (count == temp.length) {
            break;
        }
        temp[count] = items[i];// Copy subarray to temp
        count++;
    }

    int i1 = 0;
    int i2 = mid + 1;
    for (int curr = left; curr <= right; curr++) {
        if (i1 >= mid) { // Left subarray exhausted
            items[curr] = items[i2++];
        } else if (i2 > right) { // Right subarray exhausted
            items[curr] = temp[i1++];
        } else if (temp[i1].compareTo(items[i2]) <= 0) {
            items[curr] = temp[i1++];
        } else { // value
            items[curr] = items[i2++];
        }
    }

}
公共作废排序(T[]项){
//您的排序应该可以正常工作,不会分配比此更多的内存。。。
T[]温度=(T[])新的可比[(items.length+1)/2];
合并排序(items,temp,0,items.length-1);
}
私有void合并排序(T[]项,T[]临时,左整数,右整数){
如果(左==右){
return;//区域有一条记录
}
int mid=((右+左))/2;//选择中点
合并排序(项目、临时、左、中);//合并排序前半部分
合并排序(项目、临时、mid+1、右侧);
合并(项目、临时、左、中、右);
}
/**
*合并两个已排序的子数组。
*/
私有无效合并(T[]项、T[]临时、左整数、中整数、右整数){
整数计数=0;
对于(int i=左;i右){//右子阵列
项目[curr]=临时[i1++];
}else if(临时[i1]。比较(项目[i2])