147. 对链表进行插入排序

对链表进行插入排序。

Insertion-sort-example-300px.gif

<small style="box-sizing: border-box; font-size: 12px;">插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。</small>

插入排序算法:

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

示例 1:

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

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

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func insertionSortList(head *ListNode) *ListNode {
    newNode := head

    arrayList := make([]*ListNode, 0)
    arrayList = append(arrayList, head)
    for {
        head = head.Next
        if head == nil {
            break
        }
        arrayList = append(arrayList, head)
    }
    for i := 1; i <= len(arrayList)-1; i++ {
        j := i
        z := i - 1
        for {
            if z < 0 {
                break
            }
            if arrayList[j].Val <= arrayList[z].Val {
                temp := arrayList[j]
                arrayList[j] = arrayList[z]
                arrayList[z] = temp
                j--
                z--
            } else {
                break
            }

        }
    }
    for i := 0; i <= len(arrayList)-1; i++ {
        newNode.Next = arrayList[i]
        newNode = newNode.Next
    }
    return newNode.Next
}


func insertionSortList(head *ListNode) *ListNode {
    begin := head
    end := head
    current := begin.Next
    if end == nil {
        return head
    }

    for {
        if end == nil {
            break
        }
        if current == nil {
            break
        }
        if current.Val >= end.Val {
            end.Next = current
            end = current
            current = current.Next
        } else {
            before := begin
            from := begin
            for {
                if current.Val < from.Val {
                    now := current.Next
                    current.Next = from
                    if before != from {
                        before.Next = current
                    } else {
                        begin = current
                    }
                    current = now
                    break
                }

                if current.Val > from.Val && from != end {
                    before = from
                    from = from.Next
                }
            }
        }

    }
    return begin
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭...
    石先阅读 2,870评论 0 1
  • 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭...
    vbuer阅读 203评论 0 0
  • 原文《子曰:“不仁者不可以久处约,不可以长处乐。仁者安仁,知者利仁。” 》 “不仁者不可以久处约,不可...
    郭月山阅读 292评论 0 0
  • 守心向暖阅读 1,251评论 1 1
  • 斑马线上的文明行走
    开禾阅读 187评论 0 0