1.算法思想
解法可分为两种:
① 先将链表的数据复制到数组中,再采用时间复杂度为O(nlog2n)的算法进行排序,然后将数组元素依次插入到链表中,是以空间换时间的策略。
② 采用直接插入排序的思想,将链表分为两条链,一条由头结点及一个数据结点构成,另一条由剩下的结点构成。然后依次扫描第二条链中剩下的结点,并通过比较大小插入到第一条链中去。该算法的时间复杂度为O(n^2)
下面的代码采用的是第二种的解法。
2.源代码
void LinkSort(List list) {
Node pre,r,work;
r = list->Next->Next;
list->Next->Next = NULL; //构造只有一个结点的链表
work = r; //work为第二条链的工作指针
while (work!=NULL) {
r = work->Next; //保存work结点后的结点指针
pre = list; //每次都从表头开始比较
while (pre->Next != NULL && work->Data > pre->Data)
pre = pre->Next;
/*下面两步为插入操作*/
work->Next = pre->Next;
pre->Next = work;
//P向后扫描
work = r;
}
}