插入排序
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题目:对链表进行插入排序
解题代码:
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