对链表进行排序

时间:2014-05-23 09:05:03

标签: c linked-list

想要对链表进行排序,但我的代码不想:)

这是:

void swap(element *p,element*q) {
    int aux;

    aux=p->info;
    p->info=q->info;
    q->info=aux;
}

void ordonare(element *lista) {
    element *p,*q;

    for(p=lista; p!=NULL; p=p->urmator) {
        if(p->info>p->urmator->info) {
            swap(p,p->urmator);
        }
    }
}

如果这样做,它只会对值进行排序,而不会更改节点'位置。 我似乎无法在这里找到错误,如果您还能指出节点将改变其位置的解决方案,我将不胜感激。

谢谢, 拉杜

更新

上面的代码有效,但正如@ Daniel.S所提到的,它只在列表中进行一次迭代。

我应该在什么条件下进行迭代才能进行排序?

谢谢!:)

2 个答案:

答案 0 :(得分:2)

查找merge sort,它非常适合列表并且易于实施。该链接有一个示例实现:

  

合并排序通常是排序链表的最佳选择:在这种情况下,以这样的方式实现合并排序相对容易,它只需要Θ(1)额外空间和慢随机访问性能一个链表使一些其他算法(如quicksort)表现不佳,而其他算法(如heapsort)完全不可能。

答案 1 :(得分:0)

您的排序算法不完整。你在循环中缺少部分。对列表进行一次循环迭代是不够的。例如:

您有列表{3,2,1}。如果您使用算法对其进行排序,它将首先比较3和2并交换它们,然后得到

{2,3,1}然后它将比较3和1并交换它们。然后你得到{2,1,3}。您的算法在这里完成,但列表尚未排序。

根据您要实施的算法(例如冒泡排序),您必须添加其他代码。

您想要实施哪种算法?