分治法下的简单的归并排序算法复杂度O(n)=nlogn,用三个函数:
mergesort:合并排序
splitsort:单个子集排序(子集为不多于2个元素)
splitarry:递归拆分大的需排序数组,拆分为元素不多于2个子集合,然后调用splitsort和mergesort做归并排序。
这里的数组全部都用List类型
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 06 18:42:12 2013
@author: zzcwing
"""
#简单的合并排序,假设输入一个List,将list拆分为不大于2个元素的子list,分别对各子list排序
#mergesort将已经排序的子序列合并排序,复杂度O(n)
def mergesort(s1,s2):
sortedlist=[]
i=0
j=0
s=0
M=True
while M:
if i==len(s1) and j
s=j
while s
sortedlist.append(s2[s])
s=s+1
M=False
elif i
s=i
while s
sortedlist.append(s1[s])
s=s+1
M=False
elif i==len(s1) and j==len(s2):
M=False
else:
if s1[i]<=s2[j]:
sortedlist.append(s1[i])
i=i+1
else:
sortedlist.append(s2[j])
j=j+1
return sortedlist
#子list排序,O(1)
def splitsort(scell):
ts=0
if len(scell)==2:
if scell[0]>scell[1]:
ts=scell[0]
scell[0]=scell[1]
scell[1]=ts
return scell
#递归拆分,将要排序的List递归拆分为只有小于等于2个元素的list,然后依次从底层逐级合并排序,复杂度O(n)=nlogn
def splitarry(wary):
lens=len(wary)
if lens>=3:
if lens%2==0:
mid=(0+lens)/2-1
else:
mid=(0+lens-1)/2
s1=wary[0:mid+1]
s2=wary[mid+1:lens]
return mergesort(splitarry(s1),splitarry(s2))
else:
return splitsort(wary)
#测试
print splitarry([2,7,3,5,1,9,6,16,15,14,4,8,10,11,13,12])
结果如下: