您的位置:首页 > 其它

LeetCode Insertion Sort List

2015-12-16 15:00 281 查看
题目:

Sort a linked list using insertion sort.

题意:

用插入排序将一个单链表的元素排序。

题解:

首先得明白什么是插入排序?

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
以下附java版本的插入排序代码:

private static int[] insertSort(int[]arr)
{
if(arr == null || arr.length < 2)
{
return arr;
}
for(inti=1;i<arr.length;i++)
{
for(intj=i;j>0;j--)
{
if(arr[j]<arr[j-1])
{
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
else
{
//接下来是无用功
break;
}
}
}
return arr;
}

基本思路可以通过上面的代码来理解,所以我在考虑用插入排序实现单链表的排序的时候,首先也将单链表分为两部分,第一部分是已经排完序的部分,另一部分是未排完序的部分,然后就是来一个数据,先和之前的那个元素比较,如果比它小,那么就是要从头节点开始直到前一节点为止进行比较,直到找到正确的插入位置,这里需要注意的是外层循环的时候设置了一个pre和next指针,尤其是pre指针是一直指向头结点,无论头结点是否变化,而在内层循环中,则每次都会新生成一个内层的insertpre的,需要每次将这个pre赋给insertpre,因为到时候是这个insertpre在向下走,在循环往下走。这是一个技巧,还有就是如果发现一个节点需要插入到头结点处,那么这个头结点就需要重新赋值了,否则会出错。
public ListNode insertionSortList(ListNode head)
{
if(head == null || head.next == null)
return head;
ListNode pre = new ListNode(-1);
pre.next = head;
ListNode node = head;
ListNode next = head.next;
while(next != null)
{
if(next.val >= node.val)
{
node = node.next;
next = node.next;
}
else
{
ListNode insertpre = pre;
ListNode insertnode = head; //因为这里每次都会新赋给head
while(insertnode.val <= next.val)
{
insertpre = insertnode;
insertnode = insertnode.next;
insertpre.next = insertnode;
}
ListNode temp = next;
node.next = next.next;
next = next.next;
insertpre.next = temp;
if(insertnode == head) //这里要当心,判断是否头结点已经变化,如果变化,那么原先的head就需要重新赋值
head = insertpre.next;
temp.next = insertnode;
}
}
return pre.next;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: