您的位置:首页 > 其它

基于链表的两种排序算法

2010-09-29 23:33 197 查看
这个星期做数据结构课设,涉及到两个基于链表的排序算法,分别是基于链表的选择排序算法和归并排序算法。写出来跟大家一起分享一下,希望对数据结构初学朋友有所帮助,高手就直接忽视它吧。话不多说,下面就看代码吧。
node *sorted(node *sub_root)
{
if (sub_root->next)
{
node * second_half = NULL;
node * first_half = sub_root;
node * temp = sub_root->next->next;
while (temp)
{
first_half = first_half->next;
temp = temp->next;
if(temp)
temp = temp->next;
}
second_half = first_half->next;
first_half->next = NULL;
node * lChild = sorted(sub_root);
node * rChild = sorted(second_half);
if (lChild->data < rChild->data)
{
sub_root = temp = lChild;
lChild = lChild->next;
}
else
{
sub_root = temp = rChild;
rChild = rChild->next;
}
while (lChild&&rChild)
{
if (lChild->data < rChild->data )
{
temp->next = lChild;
temp = temp->next;
lChild = lChild->next;
}
else
{
temp->next = rChild;
temp = temp->next;
rChild = rChild->next;
}
}
if (lChild)
temp->next = lChild;
else
temp->next = rChild;
}
return sub_root;

}


上面贴出来的就是归并排序的算法,刚开始写的时候,由于考虑不够周到,出现许多错误,经过调式之后,才能运行成功。在这里,我想借用我朋友说过的一句话,程序是通告调出来的,希望还没学会调式的刚接触编程语言的朋友,尽快学会调式程序。

基于链表的排序,我认为归并排序的效率最高。归并排序思路简单,但是在实现的过程中涉及到指针操作,指针操作对于c初学朋友来说或许是一个头痛的事情。

好了,说下一个排序方法吧,叫基于链表的选择排序算法。虽然这种排序算法,运用也链表的排序效率很低,但是有些朋友,在对数组排序时已经习惯用选择排序算法,他们也想方设法写出基于链表排序的选择排序算法,我是应一位朋友的求助,才写这个排序算法的,原因是在原来的链表上直接进行操作,其中就涉及到链表的拆分、合并等等问题。下面请看代码
void seleted_sort(node *&head)
{
node *sorted,*unsorted,*min,*upmin;
unsorted = head;
sorted = NULL;
while (unsorted->next)
{
min = unsorted;
node *temp = unsorted->next;
//在未排序部分找出最小元素的指针min
while (temp)
{
if ((min->data > temp->data))
min = temp;
temp = temp->next;
}
if (unsorted == min)
sorted = unsorted;
else
{
upmin = unsorted;		//找出找出指向min的链元素
while (upmin->next != min)
upmin = upmin->next;
upmin->next = min->next;
if (sorted == NULL)
{
min->next = head;
head = sorted = min;
}
else
{
sorted->next = min;
min->next = unsorted;
sorted = min;
}
}
unsorted = sorted->next;
}
}


呵呵,上面的代码中肯定还有很多需要完善的地方,如果你在使用的过程当中出现问题了,请别发牢骚,调一调,相信结果就会出来的。嘻嘻,小弟第一次写博,献丑了,多多包涵……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: