基于链表的两种排序算法
2010-09-29 23:33
197 查看
这个星期做数据结构课设,涉及到两个基于链表的排序算法,分别是基于链表的选择排序算法和归并排序算法。写出来跟大家一起分享一下,希望对数据结构初学朋友有所帮助,高手就直接忽视它吧。话不多说,下面就看代码吧。
上面贴出来的就是归并排序的算法,刚开始写的时候,由于考虑不够周到,出现许多错误,经过调式之后,才能运行成功。在这里,我想借用我朋友说过的一句话,程序是通告调出来的,希望还没学会调式的刚接触编程语言的朋友,尽快学会调式程序。
基于链表的排序,我认为归并排序的效率最高。归并排序思路简单,但是在实现的过程中涉及到指针操作,指针操作对于c初学朋友来说或许是一个头痛的事情。
好了,说下一个排序方法吧,叫基于链表的选择排序算法。虽然这种排序算法,运用也链表的排序效率很低,但是有些朋友,在对数组排序时已经习惯用选择排序算法,他们也想方设法写出基于链表排序的选择排序算法,我是应一位朋友的求助,才写这个排序算法的,原因是在原来的链表上直接进行操作,其中就涉及到链表的拆分、合并等等问题。下面请看代码
呵呵,上面的代码中肯定还有很多需要完善的地方,如果你在使用的过程当中出现问题了,请别发牢骚,调一调,相信结果就会出来的。嘻嘻,小弟第一次写博,献丑了,多多包涵……
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; } }
呵呵,上面的代码中肯定还有很多需要完善的地方,如果你在使用的过程当中出现问题了,请别发牢骚,调一调,相信结果就会出来的。嘻嘻,小弟第一次写博,献丑了,多多包涵……
相关文章推荐
- 基于数组和链表两种方式实现栈
- 两种基于分治思维的排序算法
- 基于C语言的线性表操作,包含单链表和顺序线性表两种类型
- PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
- 第二周项目3--两种排序算法的运行时间
- 生产者与消费者模型(基于单链表、环形队列、多线程、多消费多生产)
- [置顶] 基于比较的排序算法
- 第二周项目3-体验复杂度-两种排序算法的运行时间
- 第二周项目三体验复杂度 两种排序算法的运行时间
- 基于链表的进程内(多线程)通信
- Kubernetes 和 Swarm 两种docker集群,基于ansible的自动化安装部署(已测)
- 基于链表实现Java 自定义Stack栈
- 基于结构体数组的链表实现
- mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)
- 基于链表的队列实现
- 基于复杂问题求解策略设计的排序算法
- c语言基于固定块链表的内存池 (转)
- 学生管理系统——基于双向循环链表