问题描述:
- 设计一个合并排序的算法?(分治法解)
- 计算其时间复杂度?(要求写出递推公式,及其求解过程)
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 12 11:21:24 2022
@author: Dell
"""
def MergeSort(ary, begin, end) :
if begin + 1 < end :
middle = (end + begin) / 2
MergeSort(Array, begin, middle) #归并前半个数组
MergeSort(Array, middle, end) #归并后半个数组
Merge(Array, begin, middle, end) #将两个数组合并
return -1
def Merge(ary, begin, middle, end) :
n1 = middle - begin
n2 = end - middle
left = [0 for i in range(n1)]
right = [0 for i in range(n2)]
for i in range(n1) :
left[i] = ary[begin + i]
for i in range(n2) :
right[i] = ary[middle + i]
i = 0
j = 0
key = 0
for key in range(end) :
if i < n1 and left[i] <= right[j] :
ary[key] = left[i++]
if j < n2 and left[i] >= right[j] :
ary[key] = right[j++]
if i == n1 and j < n2) :
ary[key] = right[j++]
if j == n2 and i < n1 :
ary[key] = left[i++]
if __name__=='__main__':
input_list = [3, 5, 8, 1, 4, 9, 12, 6, 7, 14]
print('输入数组:', input_list)
output_list = MergeSort(input_list, 0, 9)
print('排序后数组:', output_list)
- 第一步,将待排序的元素序列一分为二,得到两个长度基本相同的子序列;
- 第二步,若子序列较长则继续重复以上一分为二的步骤,直至子序列的长度不大于1,对两个子序列分别排序;
- 第三步,将排好序的子序列合并成一个有序数列,直至所有子序列全部合并,实现函数即为MergeSort函数;
递推公式:
T(n) = 2T(n/2) + O(n)
= 2(2T(n/4)) + O(n/2) + O(n) = 4T(n/4) + 2O(n)
= 8T(n/8) + 3O(n)
…
= 2xT(n/2x) + x O(n)
这里如果令n = 2x,则x=logn, T(n) = nT(1) + lognO(n)
= n + lognO(n)
= O(nlogn)