我编写了一个合并排序算法,它比冒泡排序和快速排序花费了更多的时间。
有人可以帮我优化一下吗?这是代码。
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++;
}
}
提前致谢!
答案 0 :(得分:1)
问题出在你的合并方法中。左半部分和右半部分已经排序,不需要优先级队列。通过在mergeSort
之前发生的merge
递归调用对这两半进行排序。只需比较每一半的第一个元素,然后选择较小的元素。
此外,array
参数定义为List
。除非是ArrayList
,否则访问单个元素可能会很昂贵。