给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头
插入排序 算法的步骤:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入 重复直到所有输入数据插入完为止
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中对链表进行插入排序
插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加 111,直到全部元素都加入到有序序列中
如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列后面的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将待插入元素置于插入位置
输入: head = [4,2,1,3]
输出: [1,2,3,4]
输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]
插入排序
链表中的插入排序和排序算法中的排序是不一样的
所以插图排序的动图仅作参考
struct ListNode* insertionSortList(struct ListNode* head){
if(head==NULL)
{
return head;//NULL//如果链表为NULL则返回head//NULL
}
struct ListNode*dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));//辅助节点
dummyHead->val=0;dummyHead->next=head;
struct ListNode*cur=head->next;
struct ListNode*prev=NULL;
prev=head;
struct ListNode*midi=NULL;
while(cur!=NULL)//遍历链表
{
if(cur->val>=prev->val)//寻找需要向前插入的节点
{
cur=cur->next;
prev=prev->next;
}
else
{
midi=dummyHead;
while(midi->next->val<=cur->val)//寻找插入位置
{
midi=midi->next;
}
prev->next=cur->next;//进行插入
cur->next=midi->next;
midi->next=cur;
cur=prev->next;
}
}
return dummyHead->next;
}