链表排序算法总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这个星期做数据结构课设,涉及到两个基于链表的排序算法,分别是基于链表的选择排序算法和归并排序算法。写出来跟大家一起分享一下,希望对数据结构初学朋友有所帮助,高手就直接忽视它吧。话不多说,下面就看代码吧。
[c-sharp]view plaincopy
1.node *sorted(node *sub_root)
2.{
3.if (sub_root->next)
4. {
5. node * second_half = NULL;
6. node * first_half = sub_root;
7. node * temp = sub_root->next->next;
8.while (temp)
9. {
10. first_half = first_half->next;
11. temp = temp->next;
12.if(temp)
13. temp = temp->next;
14. }
15. second_half = first_half->next;
16. first_half->next = NULL;
17. node * lChild = sorted(sub_root);
18. node * rChild = sorted(second_half);
19.if (lChild->data < rChild->data)
20. {
21. sub_root = temp = lChild;
22. lChild = lChild->next;
23. }
24.else
25. {
26. sub_root = temp = rChild;
27. rChild = rChild->next;
28. }
29.while (lChild&&rChild)
30. {
31.if (lChild->data < rChild->data )
32. {
33. temp->next = lChild;
34. temp = temp->next;
35. lChild = lChild->next;
36. }
37.else
38. {
39. temp->next = rChild;
40. temp = temp->next;
41. rChild = rChild->next;
42. }
43. }
44.if (lChild)
45. temp->next = lChild;
46.else
47. temp->next = rChild;
48. }
49.return sub_root;
50.
51.}
上面贴出来的就是归并排序的算法,刚开始写的时候,由于考虑不够周到,出现许多错误,经过调式之后,才能运行成功。在这里,我想借用我朋友说过的一句话,程序是通告调出来的,希望还没学会调式的刚接触编程语言的朋友,尽快学会调式程序。
基于链表的排序,我认为归并排序的效率最高。归并排序思路简单,但是在实现的过程中涉及到指针操作,指针操作对于c初学朋友来说或许是一个头痛的事情。
好了,说下一个排序方法吧,叫基于链表的选择排序算法。虽然这种排序算法,运用也链表的排序效率很低,但是有些朋友,在对数组排序时已经习惯用选择排序算法,他们也想方设法写出基于链表排序的选择排序算法,我是应一位朋友的求助,才写这个排序算法的,原因是在原来的链表上直接进行操作,其中就涉及到链表的拆分、合并等等问题。下面请看代码
[c-sharp]view plaincopy
1.void seleted_sort(node *&head)
2.{
3. node *sorted,*unsorted,*min,*upmin;
4. unsorted = head;
5. sorted = NULL;
6.while (unsorted->next)
7. {
8. min = unsorted;
9. node *temp = unsorted->next;
10.//在未排序部分找出最小元素的指针min
11.while (temp)
12. {
13.if ((min->data > temp->data))
14. min = temp;
15. temp = temp->next;
16. }
17.if (unsorted == min)
18. sorted = unsorted;
19.else
20. {
21. upmin = unsorted; //找出找出指向min的链元素
22.while (upmin->next != min)
23. upmin = upmin->next;
24. upmin->next = min->next;
25.if (sorted == NULL)
26. {
27. min->next = head;
28. head = sorted = min;
29. }
30.else
31. {
32. sorted->next = min;
33. min->next = unsorted;
34. sorted = min;
35. }
36. }
37. unsorted = sorted->next;
38. }
39.}
呵呵,上面的代码中肯定还有很多需要完善的地方,如果你在使用的过程当中出现问题了,请别发牢骚,调一调,相信结果就会出来的。嘻嘻,小弟第一次写博,献丑了,多多包涵……