一、排序问题
1.定义
输入:n个数的一个序列
输出:输入序列的一个排列,满足
二、插入排序
1. 伪代码
INSERTION-SORT(A)
for j =2 to A.length
key = A[j]
i = j-1
while i>0 and A[i]>key
A[i+1] = A[i]
i = i-1
A[i+1] = key
2. 算法复杂度
空间复杂度:,原址排序
时间复杂度:
3. Python实现
def insertion_sort(A):
n = len(A)
for j in range(1,n):
key = A[j]
i = j-1
while i>0 and A[i]>key:
A[i+1] = A[i]
i = i-1
A[i+1]=key
三、归并排序
1. 伪代码
MERGE(A,p,q,r)
n1 = q-p-1
n2 = r-q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
L[i] = A[p+i-1]
for j = 1 to n2
R[j] = A[q+j]
L[n1+1]= inf
R[n2+1]=inf
i=1
j=1
for k = p to r
if L[i]<=R[j]
A[k]=L[i]
i = i+1
else
A[k]=R[j]
j = j+1
MERGE-SORT(A,p,r)
if p<=r
m = floor((p+r)/2)
MERGE-SORT(A,p,m)
MERGE-SORT(A,m+1,r)
MERGE(A,p,m,r)
2. 算法复杂度
空间复杂度:
时间复杂度:
3. Python实现
# change the part of using sentinels
def merge(A,p,q,r):
n1 = q-p+1
n2 = r-q
L = A[p:q+1]
R = A[q+1:r+1]
i = 0
j = 0
k = p
while i<n1 and j<n2:
if L[i]<=R[j]:
A[k] = L[i]
i = i+1
else:
A[k] = R[j]
k = k+1
while i<n1:
A[k] = L[i]
k = k+1
i = i+1
while j<n2:
A[k]=R[j]
k = k+1
j = j+1
def merge_sort(A,p,r):
if p<r:
m = (p+r)//2
merge_sort(A,p,m)
merge_sort(A,m+1,r)
merge(A,p,m,r)