您的位置:首页 > 其它

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

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

节点定义:

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呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: