本章主要介绍了两个基础排序算法,插入排序和归并排序算法,接下来用python语言对这两个算法进行实现。
插入排序
算法思路:类似打牌场景,从桌子上每次抽取一张牌,然后从右往左扫描我们手中的牌,一一进行对比(手中的牌已排好序),然后插入到适中位置
算法时间复杂度:
O
(
n
2
)
O(n^{2})
O(n2)
python实现:
def insert_sort(A):
for i in range(1,len(A)):
key = A[i]
j = i - 1
while j>=0 and A[j]>key:
A[j+1] = A[j]
j-=1
A[j+1] = key
return A
if __name__=='__main__':
A = [1,2,48,90,3]
print(A)
A = insert_sort(A)
print(A)
归并排序
算法思路:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
每层递归都有三个步骤:
- 分解原问题为若干子问题
- 解决这些子问题,若子问题的规模足够小,则直接求解
- 合并子问题的解成原问题的解
归并排序算法的关键操作是“合并”步骤中两个已排序序列的合并
算法复杂度:
O
(
n
l
g
n
)
O(nlgn)
O(nlgn)
python实现:
import sys
maxs = sys.maxsize
#合并操作
def merge(L,R):
B = []
# 两个哨兵
L.append(maxs)
R.append(maxs)
m,n = 0,0
#循环L和R长度次数(减去两个哨兵),放两个哨兵,则可以一次循环把所有值都参与对比
for i in range(len(L)+len(R)-2):
if L[m]<=R[n]:
B.append(L[m])
m+=1
else:
B.append(R[n])
n+=1
return B
def merge_sort(A):
if len(A)<=1:
return A
middle = int(len(A)/2)
left = merge_sort(A[:middle])
right = merge_sort(A[middle:])
return merge(left,right)
if __name__=='__main__':
A = [1,2,34,56,23,2,47]
print(A)
A = merge_sort(A)
print(A)