思想
归并排序就是利用分治思想,合——分——合,把两个有序的子数组合并为一个有序数组,合并的策略就是比较两个子数组中还未参与排序部分的头元素,把较小的元素加进来。归并排序是稳定的排序。
示例
对序列[7,6,4,3,1,2,8,5]按升序排列。
合——分:
[7,6,4,3,1,2,8,5] -> [7,6,4,3],[1,2,8,5] -> [7,6],[4,3],[1,2],[8,5] -> [7],[6],[4],[3],[1],[2],[8],[5]
分——合:
[7],[6],[4],[3],[1],[2],[8],[5] -> [6,7],[3,4],[1,2],[5,8] -> [3,4,6,7],[1,2,5,8] -> [1,2,3,4,5,6,7,8]
代码
class Solution:
# @param {int[]} A an integer array
# @return nothing
def sortIntegers2(self, A):
# Write your code here
s = 0
e = len(A) - 1
self.sortMerge(A, s, e)
# 合并函数
def merge(self, A, s, mid, e):
L = A[s:mid + 1]
R = A[mid + 1:e + 1]
L.append(2 ** 31)
R.append(2 ** 31)
i = 0
j = 0
for k in range(s, e + 1):
if L[i] <= R[j]:
A[k] = L[i]
i += 1
else:
A[k] = R[j]
j += 1
# 归并排序的递归版本
def sortMerge(self, A, s, e):
mid = (s + e) / 2
if s < e:
self.sortMerge(A, s, mid)
self.sortMerge(A, mid + 1, e)
self.merge(A, s, mid, e)
# 归并排序的非递归版本
def sortMerge1(self, A, s, e):
size = 1
while size <= e - s:
l = s
while l + size - 1 <= e - 1:
mid = l + size - 1
h = mid + size
h = min(h, e)
self.merge(A, l, mid, h)
l = h + 1
size *= 2
复杂度分析
时间复杂度 O(nlogn) ,空间复杂度 O(n) 。