mergesort是否有节省空间的实现?

时间:2013-02-12 00:43:18

标签: java mergesort space-complexity space-efficiency

我刚刚编写了mergesort的这个工作版本:

static int[] merge(int[] first, int[] second){
    int totalsize = first.length + second.length;
    int[] merged_array = new int[totalsize];
    int i = 0, firstpointer = 0, secondpointer = 0;
    while(i < totalsize){
        if(firstpointer == first.length){
            merged_array[i] = second[secondpointer];
            ++secondpointer;
        }
        else if(secondpointer == second.length){
            merged_array[i] = first[firstpointer];
            ++firstpointer;
        }
        else if(first[firstpointer] < second[secondpointer]){
            merged_array[i] = first[firstpointer];
            ++firstpointer;
        }
        else{
            merged_array[i] = second[secondpointer];
            ++secondpointer;
        }
        ++i;
    }
    return merged_array;
}

static int[] mergesort(int[] array){

    if(array.length == 1){
        return array;
    }
    else{
        int length = array.length;
        int[] first = Arrays.copyOfRange(array, 0, (int) length / 2);
        int[] second = Arrays.copyOfRange(array, (int) length / 2, length);
        return merge(mergesort(first), mergesort(second));
    }

}

但是,如果您注意到,我使用copyOfRange函数创建一个新数组,该数组是父数组的某个部分的副本。在java中是否有一个比这更节省空间的mergesort实现?

1 个答案:

答案 0 :(得分:2)

重复:How to sort in-place using the merge sort algorithm?

总结:是的,有内存效率的合并排序,但它们要么a)非常复杂,要么b)没有时间效率:O(n ^ 2 log n)

基本上,不要打扰。实际上并没有那么多你要保存的内存,如果你真的想要,那就改用快速排序。