对链表进行插入排序。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
ListNode* insertionSortList(ListNode* head) {
if(head == NULL || head->next == NULL)
{
return head;
}
ListNode* dummy = new ListNode(0);
ListNode* sorted = head;
dummy->next = head;
// (优化)跳过开头已经有序的部分
while(sorted!=NULL && sorted->next!=NULL && sorted->val < sorted->next->val)
{
sorted = sorted->next;
}
// 对剩余无序的部分进行插入排序
while(sorted != NULL && sorted->next != NULL)
{
ListNode* pCur = sorted->next;// 当前要插入的元素
sorted->next = pCur->next; // 取出该元素,防止断链
ListNode* pp = dummy;
ListNode* p = dummy->next;
while(p!=sorted && pCur->val > p->val)
{
pp = pp->next;
p = p->next;
}
if(p!=sorted || pCur->val <= p->val)
{
pCur->next = p;
pp->next = pCur;
}
else
{
pCur->next = sorted->next;
sorted->next = pCur;
sorted = sorted->next;
}
pCur = pCur->next;
}
return dummy->next;
}
ListNode* insertionSortList(ListNode* head) {
if(head==NULL)
return head;
ListNode *p=head;//输入元素
ListNode *q=head;//找插入位置
ListNode *k=q;//记录q前一个指针,修改指针时使用
while(p->next!=NULL)
{
if(p->val < p->next->val)//若原本的大小顺序不用变
{
p=p->next;
continue;
}
//找到合适的插入位置q
if(p->next->val < q->val)
{
ListNode *temp=p->next;
p->next=temp->next;
temp->next=q;
if(q==head)
{
head=temp;
}
else
{
k->next=temp;
}
q=head;//从头开始检索
}
else
{
if(q==p)
{
p=p->next;
continue;
}
else
{
k=q;
q=q->next;
}
}
}
return head;
}
};