第一部分
归并排序的思路:
假设有一段长度为8的数组
通过函数不断地递归自己,将这段数组不断拆分成
8
4 4
2…
1…
的结构,当长度为1时,不满足递归条件,因此此时函数向下探到头了,开始向上弹。上弹一层后发现
现在面前的数组即倒数第二层长度为2的数组,开始调用另外一个函数对这个len(a)=2的数组进行排序
排完了再上一层,长度为4,此时发现从3,4号又可以探下去,于是又进行类似上面排序的循环。
总地来说,一个总长为8的数组,合并函数曾经经过的操作为:
对比2-2-4-2-2-4-8
代码如下
def gbsort(nums,l,r):
if l<r:
m=(l+r-1)/2
gbsort(nums,l,m)
gbsort(nums,m+1,r)
merge(nums,l,m,r)
else:
return
def merge(nums,l,m,r):
n1=m-l+1
n2=r-m
left=[0]*(n1)
right=[0]*(n2)
for i in range(n1):
left[i]=nums[l+i]
for i in range(n2):
right[i]=nums[m+1+i]
i=j=0
k=l
while i<n1 and j<n2:
if left[i]<right[j]:# "="
nums[k]=left[i]
i+=1
k+=1
else:
nums[k]=right[j]
j+=1
k+=1
while i<n1:
nums[k]=left[i]
i+=1
k+=1
while j<n2:
nums[k]=right[j]
j+=1
k+=1
nums=[9,7,6,5,4,8]
n=len(nums)
gbsort(nums,0,n-1)
print(nums)
这一段代码在我调试过程中不断报错,经过千辛万苦终于发现原因:
m=(l+r-1)/2
中应为//
因为//才是除法且向下取整,/完是float类型。