插入排序

1. 概述

对于少量元素排序,是一个有效的算法。

输入:n个数的一个序列 <a1, a2, a3, ..., an>

输出:输入序列的一个排序 <a1', a2', a3', ..., an'>,满足 a1' ≤ a2' ≤ a3' ≤ ... ≤ an'

时间复杂度:Θ(n²)

 

2. 工作原理

  • 情景化:排序一手扑克牌。开始的时候,左手为空,且将待排序的扑克牌牌面朝下放置在桌子上。每次从牌堆顶部拿一张扑克牌,将它插入左手中正确的位置。为了找到正确的插入位置,我们要将它从右到左与手牌进行比较。
  • 图形化:对 A = <5, 2, 4, 6, 1, 3> 进行插入排序,遍历数组中的元素,遍历元素的左边为已排序的元素,右边为待排序的元素,将遍历元素插入左边元素的正确位置中。(数组上方为数组元素的索引)

    

 

3. 实现

伪代码 INSERTION-SORT

输入参数:数组 A [1..n] 

1 INSERTION-SORT(A)
2     for j = 2 to A.length
3         key = A[j]
4         i = j - 1
5         while i > 0 and A[i] > key
6             A[i+1] = A[i]
7             i  = i - 1
8         A[i+1] = key

Python

 1 def insertionSort(A):
 2     for j in range(1, len(A)):
 3         key = A[j]
 4         i = j- 1
 5         while i >= 0 and A[i] > key:
 6             A[i+1] = A[i]
 7             i -= 1
 8         A[i+1] = key
 9 
10     return A
11 
12 
13 if __name__ == '__main__':
14     A = [5, 2, 4, 6, 1, 3]
15     result = insertionSort(A)
16     print('插入排序的结果是:%s' % result)

4. 算法题应用

Leetcode题目:对链表进行插入排序

解题思路:https://leetcode-cn.com/problems/insertion-sort-list/solution/dui-lian-biao-jin-xing-cha-ru-pai-xu-by-shi-yue-40/

解题代码:

 1 # Definition for singly-linked list.
 2 class ListNode(object):
 3     def __init__(self, x):
 4         self.val = x
 5         self.next = None
 6 
 7 class Solution(object):
 8     def insertionSortList(self, head):
 9         """
10         :type head: ListNode
11         :rtype: ListNode
12         """
13         fhead = ListNode(float('-Inf') )
14         fhead.next = head
15         pcur = fhead
16         cur = head
17 
18         while cur:
19 
20             if pcur.val <= cur.val:
21                 pcur = pcur.next
22                 cur = pcur.next
23                 continue
24             
25             pcur.next = cur.next
26             cur.next = None
27             
28             p = fhead
29             while p.next and p.next.val <= cur.val:
30                 p = p.next
31 
32             cur.next = p.next
33             p.next = cur
34             cur = pcur.next
35 
36         return fhead.next

 

posted on 2020-04-07 14:46  可尼  阅读(194)  评论(0编辑  收藏  举报

导航