插入排序的基本介绍
插入排序的时间复杂度为O(n*n),但是在 给定数据近乎有序的情况下,它的时间复杂度可以接近O(n).它的基本思想是对于当前的节点。不断与该节点前面节点进行比较,直到它前面的数据小于它。如下图所示:
对元素2进行排序时,只要往前一直找,就可以将它插入合适的位置。
插入排序基于数组很容易实现,原因在于我们可以很方便的找到每一个位置上的数据。但是链表不能这么做,原因在于很难直接去到每一个元素。结合链表的特点,我们可以设置一个虚拟的头节点,对于每一个节点,都要从该虚拟节点开始,一直到大于这个节点的数为止。
JAVA 代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head==null) return head;
ListNode dummy = new ListNode(0);
ListNode pro = dummy;
ListNode cur = head;
while(cur!=null){
ListNode nex = cur.next;
while(pro.next!=null&&pro.next.val<cur.val)
pro = pro.next;
cur.next = pro.next;
pro.next = cur;
pro = dummy;
cur = nex;
}
return dummy.next;
}
}