我认为不可能在单链表上执行插入排序吗?
我的理由:假设insertion sort
的定义意味着,当我们向外循环中向右移动时,我们在内循环中向左移动并根据需要向上移动值(向右移动)在完成内循环时插入当前值。结果,SLL无法容纳这样的算法。正确的吗?
答案 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;
}