Java 为什么合并排序比快速排序慢?

Java 为什么合并排序比快速排序慢?,java,sorting,time-complexity,quicksort,mergesort,Java,Sorting,Time Complexity,Quicksort,Mergesort,它们的时间复杂度相同,但当我在随机生成的包含100000个条目的链表上运行合并排序时: public LinkedList<Integer> linkedListSort(LinkedList<Integer> list) { if (list.size() <= 1) return list; LinkedList<Integer> left = new LinkedList<Integer>(); LinkedLi

它们的时间复杂度相同,但当我在随机生成的包含100000个条目的链表上运行合并排序时:

public LinkedList<Integer> linkedListSort(LinkedList<Integer> list) {
    if (list.size() <= 1) return list;
    LinkedList<Integer> left = new LinkedList<Integer>();
    LinkedList<Integer> right = new LinkedList<Integer>();
    int middle = list.size()/2;
    for (int i = 0; i < middle; i++) {
        left.add((int)list.get(i)); steps++;
    }
    for (int i = middle; i < list.size(); i++) {
        right.add((int)list.get(i)); steps++;
    }
    left = linkedListSort(left);
    right = linkedListSort(right);
    return merge(left, right);
}

public LinkedList<Integer> merge(LinkedList<Integer> left, LinkedList<Integer> right) {
    LinkedList<Integer> result = new LinkedList<Integer>();
    while (!(left.isEmpty()) && !(right.isEmpty())) {
        steps++;
        if ((int)left.peekFirst() <= (int)right.peekFirst()) {
            result.add(left.poll());
        } else {
            result.add(right.poll());
        }
    }
    while (!(left.isEmpty())) {result.add(left.poll()); steps++;}
    while (!(right.isEmpty())) {result.add(right.poll()); steps++;}
    return result;
}
公共LinkedList LinkedList排序(LinkedList列表){
如果(list.size()您已经实现了一个quicksort版本,它可以“就地”完成所有工作,而您的mergesort在每次递归调用时(与
merge()
)都会复制左/右的内容。这可能是造成差异的主要原因


第二,就像上面评论中提到的Luiggi一样-你是如何进行基准测试的?你是否得到了一个适当的JVM预热?你是否运行了足够的周期并取平均值?对JVM进行适当的基准测试可能很棘手:如果你没有经验,最好找一个测试并使用它!

你是如何衡量每个测试的速度的?你使用的是micr吗o基准测试框架或只是天真地一个接一个地执行?为什么你期望mergesort比quicksort快?@LuiggiMendoza我没有正确地测量它,但我必须等待至少10秒,我的mergesort才能完成,但我的quicksort并没有花费明显的时间。我还测量了compa的数量每个on和quick sort生成的Rison大约需要75000个,mergesort需要3337856个。@ErlangBestLanguage这不是时间复杂性告诉您的,也不完全是这样。还有许多其他因素,包括时间复杂性本身中隐藏的常数。不过,在这种情况下,您期望具有类似的性能是正确的。因为如果输入是排序的,这种快速排序只进行比较,不进行交换。非常快。事实上,这是一个很好的观点,我会重新考虑如何进行合并排序!谢谢!而且我还没有涉足任何适当的基准测试,主要是因为执行时间明显更长,但我会研究一下,谢谢!
public String arraySort(int[] array, int startIndex, int endIndex, int steps) {
    int leftIndex = startIndex;
    int rightIndex = endIndex;
    int pivot = array[(leftIndex + rightIndex) / 2];
    while (leftIndex <= rightIndex) {
        steps++;
        //search for an element with a higher value than the pivot, lower than it
        while (array[leftIndex] < pivot) {steps++; leftIndex++;}
        //search for an element with a lower value than the pivot, higher than it
        while (array[rightIndex] > pivot) {steps++; rightIndex--;}
        //check the left index hasn't overtaken the right index
        if (leftIndex <= rightIndex) {
            //swap the elements
            int holder = array[leftIndex];
            array[leftIndex] = array[rightIndex]; 
            array[rightIndex] = holder;
            leftIndex++; rightIndex--;
        }
    }
    if (leftIndex < endIndex) arraySort(array, leftIndex, endIndex, steps); 
    if (rightIndex > startIndex) arraySort(array, startIndex, rightIndex, steps);
    return "Quicksort on an unsorted array took " + steps + " steps.";
}