Insertion sort

Example


1 | def insertion_sort (arr): |
arr[j+1]=key:
这里要
时间复杂度
插入排序在最坏情况下(完全逆序输入)时间复杂度
最坏情况:完全逆序
假设数组是 [n, n-1, ..., 2, 1],那么:
当
i = 1(第 2 个元素),它要和前面 1 个比较、挪动。当
i = 2(第 3 个元素),要和前面 2 个比较、挪动。当
i = 3,要和前面 3 个比较、挪动。……
当
i = n-1(最后一个元素),要和前面n-1个全部比较、挪动。
总操作次数
比较/挪动的总次数是:
时间复杂度
- 这是一个 二次函数量级,即
Merge Sort

Example

1 | def merge_sort(arr,p,q): |
递归树角度理解

的来源
每次递归规模减半
归并排序的递归过程:
第 0 层:规模
第 1 层:规模
第 2 层:规模
第 3 层:规模
…
第 kk 层:规模
停止条件
递归什么时候停?
当子问题规模 = 1 时,排序自然完成,不再继续递归。
所以停止条件是
leaves(叶子结点)
什么是叶子结点
递归树的 叶子结点 指的是递归停止的地方。
在归并排序中,递归停止条件是 子数组规模 = 1(一个数本身就是有序的)。
所以叶子结点对应 规模为 1 的子问题。
叶子数量是多少
一开始我们有 n个元素。
递归分解到底,每个元素单独成为一个“子数组”。
所以叶子结点的数量就是 n。
补充两种排序方式选择排序和冒泡排序:
