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