链接列表的此合并算法的时间复杂度

时间:2017-04-30 05:51:27

标签: java algorithm sorting linked-list mergesort

我已经运行了这个算法,我知道它可行,但我不太确定它的最坏情况时间复杂度。 我认为这种mergesort算法的最坏情况时间复杂度是O(n log n)。我会感谢能够提供第二意见的任何人。

//The main function 
public Node mergeSort(Node a){
    Node oldHead = a;
    int mid = length(a)/2;

    if(a == null || a.next == null)
        return a;

    while(mid-1 > 0){
        oldHead = oldHead.next;
        mid--;
    }
    Node newHead = oldHead.next;

    oldHead.next = null;
    oldHead = a;

    Node t1 = mergeSort(oldHead);
    Node t2 = mergeSort(newHead);

    return merge(t1,t2);
}


public Node merge(Node a, Node b){
    Node result = head;

    if(a == null)
        return b;

    if(b == null)
        return a;

    if(b.name.compareTo(a.name) <= 0){
        result = b;
        result.next = merge(a,b.next);
    }
    else{
        result = a;
        result.next = merge(a.next,b);
    }           
    return result;
}


public int length(Node a){
    int count = 0;
    Node c = a;
    while( c != null){
        count++;
        c = c.next;
    }
    return count;
}

1 个答案:

答案 0 :(得分:2)

是的,这仍然是O(n log(n))。这里没有改变传统的Merge排序算法来改变它的时间复杂度。链表的唯一真正区别是将列表分成两部分。这具有O(n)的复杂性,但是它与合并操作处于相同的级别,合并操作也具有复杂度O(n)。因此它对复杂性没有整体影响。

修改。长度操作是O(n),但它又与分割操作和合并操作处于同一级别,它们也是O(n),因此它也不会影响时间复杂度。