如何在C ++中使用冒泡排序对列表进行排序

时间:2015-12-14 17:08:25

标签: c++ sorting linked-list bubble-sort

我有这堂课:

class Elem
{
public:
    int x;
    Elem *nast;
};

我有一个默认构造函数,函数显示x。我制作了十个元素列表,但如何按x排序此列表?

我试过了:

void Sortlinked_list(Elem *head)
{
    int ile = 0;
    Elem *cur;
    cur = head;
    while( cur->nast != NULL )
    {
        cur = cur->nast;
        ile++;
    }

    Elem* curr = head;
    Elem* next;
    int temp;

    for(int i = 0; i < ile; i++ )
    {
        while( curr && curr->nast )
        {

            next = curr->nast;
            while (next)
            {
                if (curr->show() > next->show())
                {
                    std::swap(next->nast, curr->nast);
                }
                next = next->nast;
            }
            curr = curr->nast;
        }
    }
}

但它不起作用。输出为:http://i.stack.imgur.com/vJrRK.png

如果有人可以帮我这个吗?我花了3个小时什么也没做。

3 个答案:

答案 0 :(得分:2)

我觉得这个算法有问题。

考虑:

7 -> 3 -> 5

在第一个循环中,cur指向7,next指向3,因此将会交换nast指针。

交换cur->nast将指向5,而next->nast指向3本身。因此链断裂,元素3丢失。

7 -> 5
3 -> 3

换句话说 - 只交换nast指针是不够的。

答案 1 :(得分:0)

这是一个简单的函数实现方法。该函数只是交换相邻元素的数据成员x

void sort( Elem * &head )
{
    Elem *first = head; 
    Elem *last = nullptr;

    while ( first && first->nast != last )
    {
        Elem *sorted = first->nast;
        for ( Elem *current = first; current->nast != last; current = current->nast )
        {
            if ( current->nast->x < current->x ) 
            {
                std::swap( current->nast->x, current->x );
                sorted = current->nast;
            }                
        }
        last = sorted;
    }

    head = first;
}

答案 2 :(得分:0)

交换列表中的节点时出现问题。如果节点是相邻的,则旋转3个下一个指针,如果节点不相邻,则交换2对下一个指针。如果代码交换指向要首先交换的节点的下一个指针,则交换后要交换的节点的下一个指针,处理这两种情况。

如果其中一个节点是列表中具有头指针的第一个节点,则会出现问题。和/或列表中具有尾指针的最后一个节点。

更简单的替代方法是使用两个列表(只需要第二个指向节点的指针,最初为NULL)。从源列表中删除节点,然后将其按顺序插入到第二个最初为空的列表中。