Insertion Sort List (8)

Sort a linked list using insertion sort.

首先总结一下插入排序和冒泡排序吧!

插入排序:

1 void inssort(int a[],int n){
2     int i,j;
3     for(i=1;i<n;i++){
4         for(j=i;j>0&&(a[j]<a[j-1]);j--)//后面的比前面小,交换
5 //这里还有j>0很容易出错,如果j=0的话,a[-1]没有意义
6             swap(a[j],a[j-1]);
7     }
8 }

冒泡排序:

void bubsort(int a[],int n){
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=n-1;j>i;j--)//从后往前,直至j=i
            if(a[j]<a[j-1])
                swap(a[j],a[j-1]);
    }

}

对于链表来说,怎么利用插入排序的思路来完成这个链表的排序呢?

我们可以重新建立一个链表来存放重新排序后的链表,这样就只需从前往后依次遍历链表中的每个元素,然后将其插入到新链表中的正确位置就行了。

下面贴出代码,仍然有一些问题需要注意,详情请看注释。

class Solution {
public://十分巧妙的代码
    ListNode *insertionSortList(ListNode *head) {//利用了插入排序的巧妙方法!只要采取重新建立链表,把数插入正确的位置的策略,这样就简单多了,实现起来很容易!
        if(!head||!head->next)
            return head;
        ListNode *temp=new ListNode (-9999);
        ListNode *ptr;
        ptr=head;
        ListNode * pre;
        while(ptr){
            ListNode *next=ptr->next;
            pre=temp;
            while(pre->next&&pre->next->val<ptr->val)
                pre=pre->next;
            ptr->next=pre->next;pre->next=ptr;
/*这两句不能内嵌入循环,因为刚开始的时候要将链表汇总的第一项加入temp的后面,如果嵌入循环的话就会超时!*/
            ptr=next;
        }
        head=temp->next;
        delete temp;
        return head;
    }
};
时间: 2024-11-06 03:37:41

Insertion Sort List (8)的相关文章

[LeetCode]Insertion Sort

Sort a linked list using insertion sort. 这道题是要求用插入排序的方式对单链表进行排序. 先不考虑边界情况: 1. 将第一个结点看做有序区,之后的所有结点看做无序区. 2. 从第二个结点p开始,遍历有序区,知道遇到比结点p值大的结点q,将结点p插入到结点q之前. 3. 重复上述步骤直到链表遍历结束. 需要注意的是: 1. 遍历无序区时,需要保存当前结点的后继结点,以防指针丢失. 2. 若原链表为空,则直接返回NULL. 下面贴上代码: /** * Defi

【LeetCode】Insertion Sort List

题目 Sort a linked list using insertion sort. 解答 链表无法像数组那样从后往前依次比较插入,只能从前往后:在链表首部添加一个哨兵可以稍微简化下代码,代码如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * }

LeetCode Insertion Sort List

class Solution { public: ListNode *insertionSortList(ListNode *head) { if (head == NULL) return NULL; ListNode* sorted_head = head; ListNode* unsorted_head = head->next; head->next = NULL; ListNode* cur = unsorted_head; while (cur != NULL) { unsorte

Insertion Sort List(单链表插入排序)

来源:https://leetcode.com/problems/insertion-sort-list Sort a linked list using insertion sort. 方法: 1. 使用一个preHead指向头节点,这样在将节点插入头节点前面时(即某个节点值比头节点小)不需要进行特殊处理 2. 从头节点开始遍历,如果当前节点的下一个节点的值比当前节点的值大,就从头开始遍历找到第一个比当前节点的下一个节点的值大的节点,并插入到它的前面,注意插入时需要同时处理节点移出位置和插入位

147. Insertion Sort List

题目: Sort a linked list using insertion sort. 思路: 链表的插入排序和数组的插入排序略有不同.以链表4->2->3->1->5为例,为方便操作添加一个头节点-1,此时链表为-1->4->2->3->1->5.基本思路为一次选择前后两个节点,若后节点大于前节点则不断向后循环,若后节点小于前节点则取出后节点,并插入到头节点和前节点之间的位置. 举例说明: 头节点为-1,cur为节点4,nextnode为节点2.此

直接插入排序(Straight Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 直接插入排序(Straight Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行直接插入排序,从而得到了有序表,具体步骤为 若新记录<有序表高位l.r[j],则设置哨兵 有序表后移,j+1=j 重复第2步,直至新纪录>=有序表中的j记录,则j+1就是要插入的位置 从而得到一个新的.记录数增加1的有序表

折半插入排序(Binary Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行折半插入排序,从而得到了有序表,具体步骤为 先将记录存在L.r[0]中,low=有序表低位下标,high=有序表高位下标 若low<=high,就将L.r[0]与mid=(low+high)/2位的数据比较,如果L.r[0]>

排序算法一:插入排序(Insertion sort)

最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解.本篇先说插入排序(insertion sort). (一)算法实现 1 protected void sort(int[] toSort) { 2 if (toSort.length <= 1) { 3 return; 4 } 5 for (int i = 1; i <

Java for LeetCode 147 Insertion Sort List

Sort a linked list using insertion sort. 解题思路: 插入排序,JAVA实现如下: public ListNode insertionSortList(ListNode head) { if(head==null||head.next==null) return head; ListNode root=new ListNode(Integer.MIN_VALUE); root.next=head; head=head.next; root.next.nex

leetcode:Insertion Sort List

Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在当前排好的结果中相对应的位置然后插进去,经过n次迭代之后就能得到排好序的结果. 可以这么做:建立一个helper头结点,然后依次将head链表中的结点有序的插入到helper链表中 代码: /** * Definition for singly-linked list. * struct ListN