Interview100-79 链表和数组的排序算法选择

题目

1. 编写实现链表排序的一种算法,说明为什么选择这种方法。

2. 编写实现数组排序的一种算法,说明为什么使用这种方法。

解法

1. 对于链表,通常使用归并排序,时间复杂度为O(nlgn),没有新节点创建。

2. 对于数组,通常采用快速排序,平均时间复杂度在比较排序算法中较低O(nlgn),且为原址稳定排序,不需要辅助空间。

3. 此外,对于非比较排序,计数排序桶排序,它们要求排序的元素在一个给定的范围内[0, k]中,时间复杂度接近线性。

链表的归并排序

LIST-MERGE-SORT(ListNode L.head, int length):
    if length == 1:
        return L.head;
    ListNode pmid = L.head;
    for i = 0 to length/2:
        pmid = pmid.next;
    ListNode p1 = LSIT-MERGE-SORT(L.head, length/2);
    ListNode p2 = LIST-MERGE-SORT(mid, length);
    MERGE(p1, p2);

MERGE(ListNode p1, ListNode p2):
    ListNode p, phead = null;
    while p1 != null && p2 != null:
        if p1.value < p2.value:
            if phead == null:
                p = p1;
                phead = p1;
            else 
                p1 = p1.next;
                p = p.next;
        if p1.value > p2.value:
            if phead == null:
                p = p2;
                phead = p2;
            else 
                p2 = p2.next;
                p = p.next;
    p.next = (p1 == null) ? p2 : p1;
    return phead;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值