题目:实现归并排序。
分析:这是分而治之的方法。排序时先将数组分成两部分,并分别进行排序,然后再把排序好序的两部分整合成一个排序数组。假如数组arr = [3, 1, 5, 6, 7, 4, 2, 8],分为两部分[3, 1, 5, 6]和[7, 4, 2, 8]。前半部分又可以继续分成两部分,分别是[3, 1]和[5, 6]。接着分别对这两部分排序,于是变成了1, 3和5,6.然后把他们合并到一起,变成1,3,5,6.这样的话前半部分久排好序了,后半部分一样处理,于是两大部分就可以排好序,最后再合并成一个拍好序的数组。
code:
def mergeSort(A):
if len(A) <= 1:
return A
# 把数组分成两部分分别排序
half = int(len(A) / 2)
first = mergeSort(A[0:half])
second = mergeSort(A[half:len(A)])
# 把两部分合并
i = 0
j = 0
newA = []
while i < len(first) or j < len(second):
if i < len(first) and j < len(second):
if first[i] <= second[j]:
newA.append(first[i])
i += 1
else:
newA.append(second[j])
j += 1
else:
# 如果后半部数组已经全部插入,那么把前半部剩余元素插入新数组
if i < len(first):
newA.append(first[i])
i += 1
# 如果前半部数组已经全部插入,那么把后半部剩余元素插入新数组
if j < len(second):
newA.append(second[j])
j += 1
return newA
A = [3, 1, 5, 6, 7, 4, 2, 8]
print(mergeSort(A))
程序运行结果:
[1, 2, 3, 4, 5, 6, 7, 8]