在单个链接列表上插入排序

时间:2011-03-28 18:04:36

标签: insertion singly-linked-list

我认为不可能在单链表上执行插入排序吗?

我的理由:假设insertion sort的定义意味着,当我们向外循环中向右移动时,我们在内循环中向左移动并根据需要向上移动值(向右移动)在完成内循环时插入当前值。结果,SLL无法容纳这样的算法。正确的吗?

3 个答案:

答案 0 :(得分:1)

好吧,我听起来像是Captain Obvious,但答案主要取决于你是否可以保持所有迭代的方向与元素链接相同,并且仍然按照你的定义实现正确的排序算法。我真的不想搞砸你对插入排序的定义,所以我担心你真的要考虑自己。至少有一段时间了。无论如何,这是一个家庭作业......;)

好的,这是我在关闭页面之前得到的。您可以反向迭代SLL,但这将需要n * n / 2次遍历才能访问所有n个元素。所以你理论上你的排序循环的任何遍历方向都没问题。猜猜它几乎解决了你的问题。

答案 1 :(得分:1)

这是可行的,也是一个值得探索的有趣问题。

插入排序算法的核心是创建一个带有第一个元素的排序序列,并通过添加新元素来扩展它,并保持序列仍然排序,直到它包含所有输入数据。

单向链表无法遍历,但您始终可以从头部开始搜索新元素的位置。

棘手的部分是在节点j之前插入节点i时,你必须很好地处理它们的邻居关系(我的意思是节点i和j的邻居都需要处理)。

答案 2 :(得分:1)

这是我的代码。我希望它对你有用。

int insertSort(Node **pHead)
{
Node *current1 = (*pHead)->next;
Node *pre1 =*pHead;
Node *current2= *pHead;
Node *pre2=*pHead;
while(NULL!=current1)
    {
    pre2=*pHead;
    current2=*pHead;

    while((current2->data < current1->data))
    {
        pre2 = current2;
        current2 = current2->next;
    }
    if(current2 != current1)
    {
        pre1->next=current1->next;
        if(current2==*pHead)
        {
            current1->next=*pHead;
            *pHead = current1;
        }
        else
        {
            pre2->next = current1;
            current1->next = current2;
        }
        current1 = pre1->next;
    }
    else
    {
        pre1 = pre1->next;
        current1 = current1->next;
    }
}
return 0;

}