【发布时间】:2011-09-04 23:43:06
【问题描述】:
我想知道如何在单链表上实现冒泡排序。例如,假设我们有一个包含以下节点的列表:
struct node {
int value;
struct node* next;
}
我相信有两种方法可以实现:
1)to directly exchange `values` in memory
2)to change `nexts`, to point to a different nodes
哪种方式更有效,有人可以给我一些例子吗?我知道与其他排序算法相比,使用冒泡排序并不是很有效。
【问题讨论】:
-
只要你不关心性能:只需从列表中创建一个数组,排序,从排序后的数组中重新创建列表。
-
我希望看到与算法相关的内存局部性问题——假设
n相对较大。在上面的例子中,值是一个 int,因此(可能)不大于指针的大小,所以我们假设 #1 和 #2 在处理器指令方面“相同”。 -
我想不出在链表上实现冒泡排序的好理由。数组上的算法本身已经 fracking 很慢,为什么要使用链表更严厉地惩罚自己?
-
@pst: "相同",除了切换两个节点中的值需要交换两个整数。要在单链表中切换两个相邻节点的位置,需要循环 3 个存储的“下一个”指针(在第一个的前身中,两个被移动)。尽管如此,仍然是同一类东西,与算法的选择无关。
-
@SteveJessop 我不确定这与算法的选择无关。根据所有这些“软因素”,如缓存和缓存行,如果链表在分配位置越来越“有序”(我假设链接单元被分配为单个块或以其他方式在内存中连续,可能不成立。)