leetcode 912 给定一个数组,将数组升序排序。
在我的另一篇文章里面已经写了快排,现在突然发现,合并排序的代码和思想都比快排简单得多。
不过有一些细节还是需要注释一下。
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
def mergesort(nums, left, right):
#和快排一样,这里的left和right是元素的位置
if left>=right:
return
mid = left + (right-left)//2
mergesort(nums,left,mid)
#这里的mid是元素位置,所以下面是mid+1,而不是mid
mergesort(nums,mid+1,right)
#mid+1是元素位置
#得到两个有序数组nums[left:mid]和nums[mid+1:right]
#下面合并两个有序数组
i,j=left,mid+1#初始元素位置
tmp=[]
while i<=mid and j<=right:
if nums[i]<nums[j]:
tmp.append(nums[i])
i+=1
else:
tmp.append(nums[j])
j+=1
#i和j必定有一个到达了mid+1 和 right+1
#所以下面是一个比较简略的合并写法
tmp=tmp+nums[i:mid+1]
tmp=tmp+nums[j:right+1]
print(tmp)
# nums=tmp # 不能用浅拷贝
nums[left:right+1]=tmp #深拷贝赋值
mergesort(nums, 0 , len(nums)-1)
return nums