c语言一层循环插入排序
链表内实现
void sortBy(LINK head, int(*f)(LINK, LINK))
{
LINK p,q,m,x;
x = head;
q = head->next;
p = head->next = NULL;//断开链表
while(q != NULL)//
{
if(!p || f(p,q)) //q插入在x和p之间
{
m = q->next;
x->next = q;
q->next = p;
q = m; //下一结点
x = head; //x、p复位
p = head->next;
}
else //继续向后查找插入位置
{
x = x->next;
p = p->next;
}
}
}
首先断开链表,第一部分看作是有序的,第二部分从第一个开始id与第一部分的id比较,找到要插入的位置,找到后将第一部分的断开,第二部分的第一个插入到找到的位置,第二部分的第一个向下移,第一部分从头节点开始重新比较。