【问题标题】:Understanding linked list sorting了解链表排序
【发布时间】:2018-08-04 01:20:35
【问题描述】:

我无法理解这段代码如何对链表进行排序。

node* sort(node *head) {
    struct node* point;
    struct node* small;
    struct node* stay;
    int temp;
    stay = head;

    while (stay != NULL) {
        point = stay->next;
        small = stay;
        while (point != NULL) {
            if (point->data < small->data) {
                small = point;
            }
            point = point->next;
        }
        temp = stay->data;
        stay->data = small->data;
        small->data = temp;
        stay = stay->next;
    }
    return head;
}

我试图在纸上遵循它,我的思考过程让我相信,如果我们要运行这个函数,一个列表会像这样排序:

5 -> 2 -> 1 -> 3  
2 -> 5 -> 1 -> 3  
2 -> 1 -> 5 -> 3  
2 -> 1 -> 3 -> 5  

我的理解是第一个while循环每次都会遍历列表,直到到达最后一个节点,而第二个while循环比较两个节点pointsmall。如果需要切换数据,则下一个代码块实际进行切换,然后stay 移动到列表中的下一个节点,point 是之后的节点。代码如何知道回到第一个节点并继续比较,以便 2 与 1 切换?感谢您的帮助。

【问题讨论】:

  • 我可能是错的,但这看起来像selection sort
  • @tonysdg 你不是,它...

标签: c sorting linked-list


【解决方案1】:

这段代码实现了选择排序:从stay (small == stay) 开始,它会搜索后面的最小值,一旦找到(即到达列表末尾)交换。

请注意,如果stay 最小,它会与自身交换(您可以通过之前的适当测试来防止这种情况:if(small != stay) { /* swap */ }

所以实际上,您的排序步骤如下:

5 -> 2 -> 1 -> 3
1 -> 2 -> 5 -> 3
1 -> 2 -> 5 -> 3 (与自身交换的第二个节点)
1 -> 2 -> 3 -> 5
1 -> 2 -> 3 -> 5(与自身交换的第四个节点)

实际上,还有一步,因为最后一个节点总是与自己交换(while(stay != NULL) 仅在 最后一个节点之后停止)。

第一个节点从一开始就被正确处理(在外循环的第一次运行中),因为 stay 最初设置为 head

【讨论】:

  • 啊,那么第二个 while 循环会运行多次,直到到达列表末尾,然后 swap 运行? (然后,第一个 while 循环再次运行)?
  • 是的。这就是嵌套循环的本质......更一般地说:控制块执行直到它们完成,无论它们在哪个上下文中(例如在另一个循环中)。从上下文看,你可以把控制块想象成在一个子程序(单独的函数)中执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多