[笔记]|[算法]MIT算法导论公开课笔记(1)——排序
python版本:python3.6
IDE:pycharm
更新日期:19/3/14
- 算法分析是关于计算机程序性能和资源利用的研究
相关材料
视频地址:点此
Introduction to Algorithms ——Thomas H.Cormen、Charles E.Leiserson等著
排序算法
Input (a1, a2, …, an)
Output(a1, a2, …, an)
such that: 使得a1<=a2<=…<=an
插入排序
伪代码:
将一组数(A[1…n])按从小到大排序。
for j ← 2 to n
do key ← A[j]
i ← j-1
while i > 0 and A[i] >key
do A[i+1] ← A[i]
i ← i-1
A[i+1] ← key
实现过程:
渐进符号:θ,去掉函数的低阶项和最高阶项系数
渐进分析:算法的时间复杂度
不要仅关注时间复杂度低的算法;在数据量不大时,时间复杂度高的算法(低速算法)可能优于时间复杂度低的算法,如图中的θ(n2)与θ(n3)
时间复杂度:
- θ(n^2)
具体代码:
def insertion_sort(input):
"""
函数说明:插入排序(直插)
时间复杂度:θ(n^2)
Parameters:
input - 待排序数组
Return:
output - 已排序数组
Blog:
https://blog.csdn.net/weixin_43991786
Modify:
19/3/14
"""
for i in range(1,len(input)):
key = input[i]
while i > 0 and key < input[i-1]:
input[i] = input[i-1]
i -= 1
input[i] = key
return input
x = [2,3,1,4,9,5,8,6,7,0]
print("原始数据: " + str(x))
print("插入排序: " + str(insertion_sort(x)))
归并排序
伪代码:
sort A[1…n]
if n = 1, done θ(1)
recursively sort(递归排序) 2T(n/2) + θ(n) if n>1
A[1…[n/2]] and
A[[n/2]…n]
合并两个数组 θ(n)
递归树分析:
递归树算法来求解渐进分析
递归树:T(n) = 2T(n/2) + cn, constc > 0
这棵树的高度为:2logn
叶子结点的数目为:n
一般在n>30时归并排序就快于插入排序了
实现思路:
- 观察两张以排序的表中,最小元素是多少 ;比较两个最小元素,取出最小值
- 取出刚刚的最小元素,递归进行1.
- 在这个过程中,我们只关注了两个最小元素,并挑出最小的,再把数组指针推进一位 (总能知道表头在哪)
时间复杂度:
θ(n*logn)
具体代码:
def merge_sort(xArr):
"""
函数说明:归并排序
时间复杂度:θ(n*logn)
Parameters:
xArr - 待排序数组
Return:
xArr - 已排序数组
Blog:
https://blog.csdn.net/weixin_43991786
Modify:
19/3/14
"""
if len(xArr) > 1:
split = len(xArr) // 2
left_Arr = merge_sort(xArr[0:split])
right_Arr = merge_sort(xArr[split:len(xArr)])
i = 0
j = 0
k = 0
while i<len(left_Arr) and j<len(right_Arr):
if left_Arr[i] < right_Arr[j]:
xArr[k] = left_Arr[i]
k += 1
i += 1
else:
xArr[k] = right_Arr[j]
k += 1
j += 1
if i == len(left_Arr):
xArr[k:] = right_Arr[j:]
if j == len(right_Arr):
xArr[k:] = left_Arr [i:]
return xArr
x = [2,3,1,4,9,5,8,6,7,0]
print("原始数据: " + str(x))
print("归并排序: " + str(merge_sort(x)))