如何对很长的链表就地排序?

vc_tapi 2005-09-04 04:47:24
链表很长,几十M。不要用很多辅助空间,效率尽可能高。

这是一个知名公司的笔试题,当然要这样要求。首先不能让辅助空间是O(n). 其次,时间代价不能是O(n*n). 面的时候我感到这是一定可以做到的。
开始想用快速排序,但在链表上做快速排序很难,需要地址排序,但这样
辅助空间是O(n).
后来成功的改造了快速排序,在链表上可以做,基本不需要辅助空间。
面我的人比较满意,但是同时指出,由于是递归,N又比较大,栈会益处的。
希望在此看到高质量的算法。
...全文
251 15 打赏 收藏 转发到动态 举报
写回复
用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)的复杂度.键值不多的话,还可以基数排序.
  • 打赏
  • 举报
回复
快排应该不需要递归地嘛 ...
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)个指针空间,
但如果节点内容比较大的话,指针空间可以忽略的。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧