归并排序:是采用分治法的典型应用,基本思想是将序列分解成最小,再排序并且合并,依次递归。
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
是稳定排序
def mergeSort(dataList):
#递归出口
if len(dataList)<=1:
return dataList
#先分解
length = len(dataList)
left = mergeSort(dataList[:length//2])
right= mergeSort(dataList[length//2:])
#合并
return mergeTwoList(left,right)
def mergeTwoList(list1,list2):
#合并两个有序的list,假设list都是从小到大排序的。
len1 = len(list1)
len2 = len(list2)
list1cusor=0
list2cusor=0
newList=[]
#两个序列都从左往右取,取较小的数据存入新的序列,完成这两个序列的合并
while list1cusor<len1 and list2cusor<len2:
if(list1[list1cusor] < list2[list2cusor]):
newList.append(list1[list1cusor])
list1cusor+=1
else:
newList.append(list2[list2cusor])
list2cusor+=1
#当一个序列的数据已经全部遍历,还有数据的序列直接依次存入新的序列即可。
while list1cusor < len1:
newList.append(list1[list1cusor])
list1cusor+=1
while list2cusor<len2:
newList.append(list2[list2cusor])
list2cusor+=1
return newList
data = [12,32,2,34,55,32,43,54,32,43]
newData =mergeSort(data)
print(newData)