如何优化合并排序算法?

时间:2015-10-09 07:11:09

标签: algorithm sorting data-structures

我编写了一个合并排序算法,它比冒泡排序和快速排序花费了更多的时间。

有人可以帮我优化一下吗?这是代码。

public static void mergeSort(List<MyElement> array, int left, int right, Comparator<? super MyElement> comp) {
    int mid;
    if(right > left) {
        mid = (right + left) / 2;
        mergeSort(array, left, mid,comp);
        mergeSort(array, mid+1, right, comp);
        merge(array, left, mid, right, comp);
    }

}


public static void merge(List<MyElement> array, int left, int mid, int right, Comparator<? super MyElement> comp) {

    PriorityQueue<MyElement> queue = 
            new PriorityQueue<MyElement>(50, comp);
    for(int i = left; i <= mid;  i++) {
        queue.offer(array.get(i));
    }
    for(int i = mid + 1; i < right;  i++) {
        queue.offer(array.get(i));
    }



    int index = left;
    while(index < right && queue.size() != 0) {
        MyElement item  = queue.remove();
        array.set(index, item);
        index++;
    }

}

提前致谢!

1 个答案:

答案 0 :(得分:1)

问题出在你的合并方法中。左半部分和右半部分已经排序,不需要优先级队列。通过在mergeSort之前发生的merge递归调用对这两半进行排序。只需比较每一半的第一个元素,然后选择较小的元素。

此外,array参数定义为List。除非是ArrayList,否则访问单个元素可能会很昂贵。