【问题标题】:Linked-Lists Bubble Sort链表冒泡排序
【发布时间】: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 我不确定这与算法的选择无关。根据所有这些“软因素”,如缓存和缓存行,如果链表在分配位置越来越“有序”(我假设链接单元被分配为单个块或以其他方式在内存中连续,可能不成立。)

标签: c list sorting


【解决方案1】:

您的值非常小,因此我希望交换它们比更改指针结构更有效。与往常一样,您必须测量用例中的实际性能才能确定。

【讨论】:

  • 但是如果我在一个结构中有多个值呢?
  • @Melvin 对于某些值大小,更改指针结构后交换值的效率会降低。确切点取决于您的平台和用例。
【解决方案2】:

如果你交换nexts,你必须考虑各种特殊情况。这使得它比更改values 慢一点。如果您的值具有更多结构,您可以选择实现next-version 或用指针替换值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2015-08-20
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多