链表快排和时间复杂度分析
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呢?
节点定义:
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呢?
相关文章推荐
- web项目开发 之 前端规范 --- HTML编码规范
- web项目开发 之 前端规范 --- CSS编码规范
- 青椒番茄土豆片
- Android透明状态栏的实现
- 用Promise-A+规范来复盘使用Promise时踩的一个小坑
- [LintCode] Reverse Pairs 翻转对
- 数值策划分享:几个经典的战斗力计算公式
- 计算机程序的思维逻辑 (8) - char的真正含义
- java中的垃圾回收之finalize()用法
- iOS UIImagePickerController 图片拾取器
- 注解
- MySQL性能瓶颈排查定位实例详解
- UNPv1第十三章:高级IO
- 【剑指offer-Java版】28字符串的排列
- 高并发访问和海量数据 大型网站架构技术一览
- Android-自定義控件使用(方便修改控件的風格,只修改布局文件)
- Spring源码分析(二)-Spring IoC容器的初始化No.2
- 0043 ubuntu下g++编译与win7中编译的区别
- POI导出数据库数据到excel
- eclipse won't start - no java virtual machine was found