气泡排序链表不排序

bubble sort linked list not sorting

本文关键字:排序 链表 气泡      更新时间:2023-10-16

为什么我的气泡排序算法不会对链表进行排序?当给定一个列表并调用该方法时,它将输出相同的列表。我的 for 循环中的当前逻辑有什么问题?

private:
    IntNode *head, *tail;

节点结构:

struct IntNode
{
    int data;
    IntNode * next;
};

气泡排序方法:

void NodeSLList::SortList()
{
    if (head == NULL || head->next == NULL)
        return;
    IntNode * current = head;
    IntNode * nextElement = current->next;
    IntNode * temp = NULL;
    int changed = 1;

    while (changed)
    {
        changed = 0;
        for (current; (current != NULL) && (nextElement = NULL); )
        {
            if (current->data > nextElement->data)
            {
                temp = current->next;
                current->next = nextElement->next;
                nextElement->next = temp;
                changed = 1;
            }
            current = current->next;
            nextElement = nextElement->next;
        }
    }
}

该问题是由在 for 循环中分配而不是比较引起的。

如果您正在实现链表,我可以建议使用哨兵而不是头部
和 NULL 作为结尾。这将在插入和移除过程中消除所有"角落情况"。
哨兵节点始终存在,不包含任何数据,指向第一项,
最后一项指向它。

我也可以建议使用 Mergesort ,它适用于链表,在 O(NlogN) 中运行,
并且没有头顶空间。您可以在此处找到实现

尝试通过调试器运行它。如果你在第二次绕changed循环时查看current的值,你会发现current仍然是null,所以第二次绕changed循环时它不会通过current循环。