zoukankan      html  css  js  c++  java
  • 单链表的插入排序

    1. 插入排序的基本思想:将一个节点插入到一个有序的序列中。对于链表而言,要依次从待排序的链表中取出一个节点插入到已经排好序的链表中,也就是说,在单链表插入排序的过程中,原链表会截断成两部分,一部分是原链表中已经排好序的节点,另一部分是原链表中未排序的节点,这样就需要在排序的过程中设置一个当前节点,指向原链表未排序部分的第一个节点。

    注意单链表插入排序和数组插入排序的不同:数组插入排序是从排好序的部分的最后一个节点往前找,找到第一个比它小的数,然后插到其后面;而单链表只能从前往后遍历,找到第一个比当前节点大的值结束,因此在遍历已经排好序的链表部分的时候,需要两个指针,一个指针用于往前遍历(该指针假设为遍历指针),一个指针用于记录遍历指针指向的当前节点的前一个节点(该指针假设为遍历指针),这样当遍历指针找到第一个比待插入节点的值大的节点的时候,就可以将待插入节点插入到记录指针的后面。(之所以使用两个指针,是因为单链表不能反指)

         插入排序分两种情况,一种是当前节点的值比已经排好序的尾节点的值大,则直接将当前节点挂在已排序的节点即可;一种是当前节点值比已经排好序的尾节点的值小,则需将已排好序的链表部分从头到尾遍历,找到第一个比当前节点值大的节点,插入到其前面即可。因为可能待插入的节点可能在第一个节点的前面,因此另外创建一个头结点,指向已经排好序的链表的第一个节点。这样可以每次插入新的节点的时候,将上面所提到的记录节点初始化为新创建的头结点,这样便于在第一个节点前面插入新节点。

     1 class Solution
     2 
     3 {
     4 
     5 public:
     6 
     7     ListNode *insertionSortList(ListNode *head)
     8 
     9     {
    10 
    11         if(head==NULL || head->next==NULL) return head;
    12 
    13         ListNode *cur=head;
    14 
    15         ListNode *helper=new ListNode(0);
    16 
    17         ListNode *pre;
    18 
    19         while(cur)
    20 
    21         {
    22 
    23             ListNode *next=cur->next;
    24 
    25             pre=helper;
    26 
    27             while(pre->next!=NULL && pre->next->val<cur->val)
    28 
    29             {
    30 
    31                 pre=pre->next;
    32 
    33             }
    34 
    35             cur->next=pre->next;
    36 
    37             pre->next=cur;
    38 
    39             cur=next;
    40 
    41         }
    42 
    43         return helper->next;
    44 
    45     }
    46 
    47  
    48 
    49 }  
  • 相关阅读:
    sublime配置攻略
    Objective-C代码块语法(block)使用
    [C/C++]_[VS2010来源与UTF8中国字符串转码ANSI问题]
    Android资源管理框架(Asset Manager)简介和学习计划
    ExtJs自学教程(1):从一切API开始
    ORACLE触发特定的解释
    同TextView在不同的显示内容
    :gAudit
    IIS日志分析 MapReduce
    图片存储心得
  • 原文地址:https://www.cnblogs.com/yuanshuang/p/5479242.html
Copyright © 2011-2022 走看看