• [Swift]LeetCode147. 对链表进行插入排序 | Insertion Sort List


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10036861.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Sort a linked list using insertion sort.

    A graphical example of insertion sort. The partial sorted list (black) initially contains only the first element in the list.
    With each iteration one element (red) is removed from the input data and inserted in-place into the sorted list

    Algorithm of Insertion Sort:

    1. Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list.
    2. At each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there.
    3. It repeats until no input elements remain.

    Example 1:

    Input: 4->2->1->3
    Output: 1->2->3->4
    

    Example 2:

    Input: -1->5->3->4->0
    Output: -1->0->3->4->5

    对链表进行插入排序。


    插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
    每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

     插入排序算法:

    1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
    2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
    3. 重复直到所有输入数据插入完为止。

     示例 1:

    输入: 4->2->1->3
    输出: 1->2->3->4
    

    示例 2:

    输入: -1->5->3->4->0
    输出: -1->0->3->4->5

    1436ms
     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func insertionSortList(_ head: ListNode?) -> ListNode? {
    14         let dummyHead = ListNode(-1)
    15         var sortedNodeIdx: ListNode? = dummyHead
    16         var curr = head
    17         
    18         while let _ = curr {
    19             while let sortedNodeIdxNext = sortedNodeIdx?.next,
    20                 sortedNodeIdxNext.val < curr!.val {
    21                     sortedNodeIdx = sortedNodeIdxNext
    22             }
    23             
    24             let currNext = curr?.next
    25             let sortedNodeIdxNext = sortedNodeIdx?.next
    26             sortedNodeIdx?.next = curr
    27             curr?.next = sortedNodeIdxNext
    28             sortedNodeIdx = dummyHead
    29             curr = currNext
    30         }
    31         
    32         return dummyHead.next
    33     }
    34 }

    2672ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func insertionSortList(_ head: ListNode?) -> ListNode? {
    14         let dummyHead = ListNode(0)
    15         dummyHead.next = head
    16         var last = dummyHead
    17         var p = head
    18         while p != nil {
    19             var tail = p?.next
    20             var q = dummyHead
    21             while q !== last {
    22                 if p!.val < q.next!.val {
    23                     p!.next = q.next
    24                     q.next = p
    25                     last.next = tail
    26                     break
    27                 }
    28                 q = q.next!
    29             }
    30             if q === last {
    31                 last = p!
    32             }
    33             p = tail
    34         }
    35         return dummyHead.next
    36     }
    37 }

    2916ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13 
    14     func insertionSortList(_ head: ListNode?) -> ListNode? {
    15         var result: ListNode? = nil        
    16         var cur: ListNode? = head
    17         while let curSafe = cur {
    18             let newNode = ListNode(curSafe.val)
    19             guard let resultSafe = result else {
    20                 result = newNode
    21                 cur = curSafe.next
    22                 continue
    23             }
    24             if resultSafe.val > curSafe.val {
    25                 let resultOld = resultSafe
    26                 result = newNode
    27                 newNode.next = resultOld
    28                 cur = curSafe.next
    29                 continue                           
    30             }
    31             var insertPos: ListNode? = result
    32             while insertPos?.next != nil && insertPos!.next!.val < curSafe.val {
    33                 insertPos = insertPos?.next
    34             }
    35             newNode.next = insertPos?.next
    36             insertPos?.next = newNode
    37             cur = cur?.next
    38         }
    39         return result
    40     }
    41 }

    3660ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     func insertionSortList(_ head: ListNode?) -> ListNode? {
    14         if head == nil || head?.next == nil { return head }
    15         let dummyNode = ListNode(-1)
    16         dummyNode.next = head
    17         var sortedIdx: ListNode? = dummyNode
    18         var currNode = head?.next
    19         head?.next = nil
    20 
    21         while currNode != nil {
    22             while sortedIdx?.next != nil {
    23                 if currNode!.val < sortedIdx!.next!.val {
    24                     let sortedNext = sortedIdx?.next
    25                     let currNext = currNode?.next
    26                     sortedIdx?.next = currNode
    27                     currNode?.next = sortedNext
    28                     currNode = currNext
    29                     sortedIdx = dummyNode
    30                     break
    31                 } else {
    32                     sortedIdx = sortedIdx?.next
    33                     if sortedIdx?.next == nil {
    34                         // currNode is the biggest one in the sortedLinkedList
    35                         let currNext = currNode?.next
    36                         sortedIdx?.next = currNode
    37                         currNode?.next = nil
    38                         currNode = currNext
    39                         sortedIdx = dummyNode
    40                         break
    41                     }
    42                 }
    43             }
    44         }
    45         
    46         return dummyNode.next
    47     }
    48 }

    3994ms

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     public var val: Int
     5  *     public var next: ListNode?
     6  *     public init(_ val: Int) {
     7  *         self.val = val
     8  *         self.next = nil
     9  *     }
    10  * }
    11  */
    12 class Solution {
    13     
    14     // key = node position
    15     // value = node object
    16     // var hash: [Int: ListNode] = [:]
    17     // var list: ListNode?
    18 
    19     var array: [ListNode] = []
    20     
    21     func insertionSortList(_ head: ListNode?) -> ListNode? {
    22         guard head != nil,
    23             head!.next != nil else {
    24             return head
    25         }
    26         
    27         // build array
    28         var node = head
    29         while node != nil {
    30             array.append(node!)
    31             node = node!.next
    32         }
    33         // print("array.count = (array.count)")
    34         
    35         // var i = 1 
    36         for i in 1..<array.count {
    37             // print("i = (i)")
    38             
    39             var j = i
    40             while j > 0 {
    41                 // print("j = (j)")
    42                 if array[j].val < array[j-1].val {
    43                     // array[j-1].next = array[j].next
    44                     // array[j].next = array[j-1]
    45                     array.swapAt(j, j-1)
    46                     j -= 1
    47                 } else {
    48                     break
    49                 }
    50             }
    51         }
    52         
    53         // connect nodes
    54         for i in 0..<array.count-1 {
    55             array[i].next = array[i+1]
    56         }
    57         array[array.count-1].next = nil
    58         
    59         return array[0]
    60     }
    61 }
  • 相关阅读:
    jQuery的核心对象、原型对象、静态方法、动态方法
    请写出css中选择器(元素选择器、类选择器、id选择器)的优先级顺序,和当各种选择器组合时,优先级的计算规则是什么?
    css3中的box-sizing常用的属性有哪些?分别有什么作用?
    不同域的页面如何通信(跨域)
    浮动与定位
    获取DOM元素的方式有哪些
    简要说明盒子模型和flex布局
    牛逼哄哄的对象深复制
    欧拉函数
    P2659 美丽的序列
  • 原文地址:https://www.cnblogs.com/strengthen/p/10036861.html
Copyright © 2020-2023  润新知