社区
数据结构与算法
帖子详情
如何对很长的链表就地排序?
vc_tapi
2005-09-04 04:47:24
链表很长,几十M。不要用很多辅助空间,效率尽可能高。
这是一个知名公司的笔试题,当然要这样要求。首先不能让辅助空间是O(n). 其次,时间代价不能是O(n*n). 面的时候我感到这是一定可以做到的。
开始想用快速排序,但在链表上做快速排序很难,需要地址排序,但这样
辅助空间是O(n).
后来成功的改造了快速排序,在链表上可以做,基本不需要辅助空间。
面我的人比较满意,但是同时指出,由于是递归,N又比较大,栈会益处的。
希望在此看到高质量的算法。
...全文
251
15
打赏
收藏
如何对很长的链表就地排序?
链表很长,几十M。不要用很多辅助空间,效率尽可能高。 这是一个知名公司的笔试题,当然要这样要求。首先不能让辅助空间是O(n). 其次,时间代价不能是O(n*n). 面的时候我感到这是一定可以做到的。 开始想用快速排序,但在链表上做快速排序很难,需要地址排序,但这样 辅助空间是O(n). 后来成功的改造了快速排序,在链表上可以做,基本不需要辅助空间。 面我的人比较满意,但是同时指出,由于是递归,N又比较大,栈会益处的。 希望在此看到高质量的算法。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gnefuil
2005-09-07
打赏
举报
回复
归并排序当然可以O(1)空间复杂度,需要复杂而巧妙的算法才能实现
vc_tapi
2005-09-07
打赏
举报
回复
"归并排序不错,O(1)的复杂度"
不可能吧,空间复杂度高。
基数排序.不错,适合于链表。
另外,如果是双向的链表,哪个给出堆排序的算发?想了好久。
skys712
2005-09-06
打赏
举报
回复
是链表的话,就把它改造成堆吧!
Zephyrzzz
2005-09-06
打赏
举报
回复
嗯,归并排序不错,O(1)的复杂度.键值不多的话,还可以基数排序.
DiabloWalkOnTheEarth
2005-09-06
打赏
举报
回复
快排应该不需要递归地嘛 ...
vc_tapi
2005-09-05
打赏
举报
回复
shell sort就是冒泡的优化,但在链表上不好,数量级高。
归并排序适合链表,有哪个给个改造好的算法?
另外,快速排序用栈消除递归,应该也不错。空间复杂度logN
vc_tapi
2005-09-05
打赏
举报
回复
good idea. but i wanna the code. here is my answer:
single linked list.
struct node {
int a;
struct node *next;
}
qsort(struct node *head, struct node *end){
struct node *p=head, *last=head;
if(head==end)
return;
for(; p!=end; p=p->next) {
if(p->a < last->a) {
swap(p, last);
last = last->next;
}
}
swap(head,last);
qsort(head, last);
qsort(last->next, 0);
}
void swap(struct node *p1,struct node *p2){
int temp ;
temp=p1->a;
p1->a = p2->a;
p2->a = temp;
}
seanzh
2005-09-05
打赏
举报
回复
以上所说都是递归的,依然会有栈溢出的问题,
为什么不考虑冒泡?对其进行改进后时间复杂度也不会达到n2
dext
2005-09-05
打赏
举报
回复
归并排序 改进一下应该可以符合要求。
gnefuil
2005-09-04
打赏
举报
回复
归并排序的空间复杂度可以是O(1)
vc_tapi
2005-09-04
打赏
举报
回复
归并排序的空间复杂度太高,考虑shell or quicksort but no recursive
gnefuil
2005-09-04
打赏
举报
回复
归并排序
MagicCarmack
2005-09-04
打赏
举报
回复
还是有一定难度滴...............
galois_godel
2005-09-04
打赏
举报
回复
好像笔试面试题都比较青睐链表
galois_godel
2005-09-04
打赏
举报
回复
如果是双向链表的话,把它改造成堆,
前项指针,后项指针当两个儿子用.辅助空间基本没有,
单项的话,要多O(n)个指针空间,
但如果节点内容比较大的话,指针空间可以忽略的。
你必须知道的495个C语言问题
1.14 我似乎不能成功定义一个
链表
。我试过typedefstruct{char*item;NODEPTRnext;}*NODEPTR;但是编译器报了错误信息。难道在C语言中结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 ...
C语言FAQ 常见问题列表
o 2.6 我似乎不能成功定义一个
链表
。我试过 typedef struct { char *item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的...
C语言数据结构与算法编程、
链表
、树、栈、队列、
排序
算法
黄老师通过对数据结构核心知识点: 顺序表、
链表
、栈、队列、树、二叉树、遍历、插入、删除、
排序
、查找算法 的细心讲解,结合生动的C语言实战代码演练、帮助学员快速掌握数据结构的核心内容、为STL、Boost标准库的...
《你必须知道的495个C语言问题》
《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...
《数据结构 1800题》
排序
方法 C. 解决问题的步骤序列 D. 调度方法 (2) A.可执行性、可移植性、可扩充性 B. 可执行性、确定性、有穷性 C. 确定性、有穷性、稳定性 D. 易读性、稳定性、安全性 【南京理工大学 1999 一、1(2分) ...
数据结构与算法
33,007
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章