分治算法(二)合并排序
1.问题分析
合并排序问题给定的是一个无序的序列,可以把待排序的元素分解为两个规模大致相等的子序列。如果还是不容易解决就继续将子序列分解,直到子序列中的元素个数为1,因为单个元素的序列本身是有序的,此时便可以进行合并,从而得到一个完整的有序序列。
2.算法设计
(1)分解:将待排序元素分成大小大致相同的两个子序列。
(2)治理:对两个子序列进行合并。
(3)合并:将排好序的有序子序列进行合并,得到最终的有序序列。
3.过程描述
4.程序代码
def Merge(A,low,mid,high):
B = [None for i in range(0,high-low+1)] #定义一个列表
i = low
j = mid + 1
k = 0
while(i <= mid and j <= high):
#按照从小到大的顺序存放到列表B中
if(A[i] <= A[j]):
B[k] = A[i]
i += 1
k += 1
else:
B[k] = A[j]
j += 1
k += 1
while(i <= mid):
#将子序列A[low:middle]剩余元素的依次复制到B中
B[k] = A[i]
i += 1
k += 1
while(j <= high):
# 将子序列A[middle+1:high]剩余的元素依次复制到B中
B[k] = A[j]
j += 1
k += 1
temp = 0
for i in range(low,high+1):
#将合并后的序列复制到原来的A[]序列
A[i] = B[temp]
temp += 1
del B
def MergeSort(A,low,high):
if low < high:
mid = (low + high) // 2
MergeSort(A,low,mid) #对A[low:mid]中的元素合并排序
MergeSort(A,mid + 1,high) #对A[mid+1:high]中的元素合并排序
Merge(A,low,mid,high) #合并操作
if __name__ == '__main__':
A = []
n = int(input('请输入数列中的元素个数n为:'))
for i in range(n):
A.append(int(input('请依次输入数列中的元素:')))
MergeSort(A,0,n-1)
print('合并排序结果为:')
for i in range(n):
print(A[i],'\t',end='')
5.运行结果
请输入数列中的元素个数n为:8
请依次输入数列中的元素:3
请依次输入数列中的元素:1
请依次输入数列中的元素:5
请依次输入数列中的元素:2
请依次输入数列中的元素:6
请依次输入数列中的元素:4
请依次输入数列中的元素:8
请依次输入数列中的元素:7
合并排序结果为:
1 2 3 4 5 6 7 8
6.复杂度分析
时间复杂度O(n logn)
空间复杂度O(n)