算法导论 第二章 算法基础
算法 | 最坏情况运行时间 | 平均/期望运行时间 | |
---|---|---|---|
1 | 插入排序 | Θ(n**2) | Θ(n**2) |
2 | 归并排序 | Θ(nlgn) | Θ(nlgn) |
3 | 冒泡排序 | Θ(n**2) | Θ(n**2) |
4 | 选择排序 | Θ(n**2) | Θ(n**2) |
5 | 堆排序 | Θ(nlgn) | |
6 | 快速排序 | Θ(n**2) | Θ(nlgn) |
7 | 计数排序 | Θ(n + k) | Θ(n + k) |
8 | 基数排序 | Θ(d(n + k)) | Θ(d(n + k)) |
9 | 桶排序 |
1.插入排序
- 思路:类似于抽牌的过程,右手一张张地抽牌,每次右手抽的牌对比左手中已经排序好的牌,放在左手相应的位置中
def sort_insert(lista): |
2.归并排序
- 思路:
- 将数组划分为2个排好顺序的数组A和B
- 每次从2个数组中抽出一个最小的放在另一个数组C中,直到A、B其中一个数组被取完,将A、B中未取完的数组放入C中
def sort_merge(lista): |
3.冒泡排序
- 思路: 从左往右,从第一个数字开始,左边一个与右边一个数字对比,如果左边比右边大,就交换顺序,然后再从第二个数字开始迭代
def sort_bubble(lista): |
4.选择排序
- 思路: 类似于冒泡排序,但是循环的时候是找出最小的数值,与循环的起始位置交换顺序
def sort_selection(lista): |
5.堆排序
- 思路: 1.将数组看做一个最大二叉堆 2.维护最大二叉堆的性质,父节点大于子节点 3.然后从根节点取出元素放到后面,重新维护最大堆的性质 4.重复3步骤,直到剩下最后1个元素
def sort_heap(lista): |
6.快速排序
- 思路: 1.将数组的第一个数字定为基准数flag,将数组中比flag小的放置在flag左边,比flag大的放置在右边 2.对flag左边的和右边的数组重复步骤1
def sort_fast(lista): |
7.计数排序
- 思路: 1.假设输入数组A[0,n], 其中最大值是max(A),假设 k >= max(A) 2.将B[0,k]每一位赋予初始值0,然后与A中元素i比较,将B[i] = B[i] + 1 3.数组B[0,k] 中的数值B[i] 就表示 A中元素i的数量 4.B[i] = B[i] + B[i-1],B中元素B[i]就代表比i小的元素的数量
def sort_count(lista): |
8.基数排序
- 思路: