链表快排和时间复杂度分析

前端时间去面试,碰到问题,快排的链表实现和时间复杂度分析,非常基础,但是当时完全没想到社招面试会涉及到这么基础的东西,回答的非常不完美,现在总结,以致后人:

节点定义:

struct Node {
    int value; //演示使用,复杂的域,使用值交换的时候可能就不合适了
    Node * next;
};

实现:

Node * part(Node *begin, Node *end){
    Node *p = begin;
    Node *q = begin->next;
    int key = begin->value;
    int tmp = -1; 
    while(q){
        if(q->value < key){
            p = p->next;
            tmp = p->value;
            p->value = q->value;
            q->value = tmp;
        }   
        q = q->next;
    }   
    tmp = p->value;
    p->value = begin->value;
    begin->value = tmp;

    return p;
}


void quick_sort(Node *begin, Node *end){
    if(!begin){
        return;
    }   

    if(begin != end) {
        Node * mid = part(begin, end);
        quick_sort(begin, mid);
        quick_sort(mid->next, end);
    }   

}

时间复杂度的分析:

因为这个算法如此经典,大家都能记住时间复杂度nlogn。

那要是分析一下怎么来的呢,一定要记住,如果你不是应届生的话,那么考察你这个问题的时候往往不是为了算法的本身,而是考察你的问题分析能力。

我的分析是这样的:

1,第一轮分割:n/2 + n/2

2,第二轮分割:n/4 +n/4 +n/4 +n/4

3,第k轮的分割:n/2**k+...+n/2**k

4,然后就是前三项的求和了,n(1/2+... +1/2**k),k是什么值呢?2**k = n(为什么?)

5,计算出来是不是nlogn呢?

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值